提出算法
Coming up with Algorithm
我有一个可变大小的零的 Matlab 数组和一个元胞数组中的字符列表。
元胞数组:
{'0000'}
{'0011'}
我想在数组中为每个 0 位放置 -1,为 1 位放置 1。
示例:
-1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 -1 -1 -1 0 0 0 0 0 0 0 0
....
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1
-1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
...
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 1 1
如您所见,基于元胞数组位 {0000}
前四个输出行将这 4 个转换后的位完全放置在所有输出行中。第二个字符 {0011}
相同。这种情况下的数组大小为(8 x 16)。数组中从左到右传播的次数 -1 -1 -1 -1
也是可变的——对于这种情况,它最多为 4 列 4 位。
同理,假设有5位:
元胞数组:
{'00000'}
{'00111'}
这将是数组:
-1 -1 -1 -1 -1 0 0 0 0 0
0 0 0 0 0 -1 -1 -1 -1 -1
-1 -1 1 1 1 0 0 0 0 0
0 0 0 0 0 -1 -1 1 1 1
在这种情况下,数组大小为(4 x 10),因为数组中从左到右传播的次数 -1 -1 -1 -1 -1
最多为 2 列 5 位。
第一个示例获得 4 个传播,第二个示例只有 2 个,因为可用列号也是一个变量。这是一个单独的参数。
这是我的代码不起作用:
counterop=0
counter=1
for i=1: numel(listofss) % list of ss is the list of charecters (my examples has 3)
for c = 1:1:(ss) % row
for e = counter:counter+(n-1) % column
A_ss(c ,e)= -1 %A_ss is the predefined matrix (in my example a 12 by 64 matrix )
end
counter=counter + n
counterop=counterop+1
end
end
if counterop > n-1
counter = 1
counterop=1
end
最好能提供带有 for 循环的工作代码。
这是一个使用 kron
的例子:
np = 4; % number of permutations/repetitions
nc = 2; % number of cells
x = {'0000','0011'} % the cell
M = sign(cell2mat(x.')-48.5) % convert string to number: ['01'] -> [-1 1]
M = kron([eye(np)],M) % apply the kronecker tensor product
ind = reshape(1:nc*np,nc,np).'; % create an alternated index
M(ind(:),:) % index the matrix
对于转换,我使用了一个小技巧:'0'- 0 = 48
在 matlab 中,因为 matlab 承认隐式转换。所以matlab取字符'0'对应的ascii值为48.
结果:
M =
-1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 -1 -1 -1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 -1 -1 -1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1
-1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 -1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 -1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 1 1
要了解此答案的工作原理,您必须阅读一些有关以下内容的文档:kron
, cell2mat
, implicit casting,
matrix indexing and, if you don't know what it is, about the transpose operator .'
我有一个可变大小的零的 Matlab 数组和一个元胞数组中的字符列表。
元胞数组:
{'0000'}
{'0011'}
我想在数组中为每个 0 位放置 -1,为 1 位放置 1。
示例:
-1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 -1 -1 -1 0 0 0 0 0 0 0 0
....
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1
-1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
...
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 1 1
如您所见,基于元胞数组位 {0000}
前四个输出行将这 4 个转换后的位完全放置在所有输出行中。第二个字符 {0011}
相同。这种情况下的数组大小为(8 x 16)。数组中从左到右传播的次数 -1 -1 -1 -1
也是可变的——对于这种情况,它最多为 4 列 4 位。
同理,假设有5位:
元胞数组:
{'00000'}
{'00111'}
这将是数组:
-1 -1 -1 -1 -1 0 0 0 0 0
0 0 0 0 0 -1 -1 -1 -1 -1
-1 -1 1 1 1 0 0 0 0 0
0 0 0 0 0 -1 -1 1 1 1
在这种情况下,数组大小为(4 x 10),因为数组中从左到右传播的次数 -1 -1 -1 -1 -1
最多为 2 列 5 位。
第一个示例获得 4 个传播,第二个示例只有 2 个,因为可用列号也是一个变量。这是一个单独的参数。
这是我的代码不起作用:
counterop=0
counter=1
for i=1: numel(listofss) % list of ss is the list of charecters (my examples has 3)
for c = 1:1:(ss) % row
for e = counter:counter+(n-1) % column
A_ss(c ,e)= -1 %A_ss is the predefined matrix (in my example a 12 by 64 matrix )
end
counter=counter + n
counterop=counterop+1
end
end
if counterop > n-1
counter = 1
counterop=1
end
最好能提供带有 for 循环的工作代码。
这是一个使用 kron
的例子:
np = 4; % number of permutations/repetitions
nc = 2; % number of cells
x = {'0000','0011'} % the cell
M = sign(cell2mat(x.')-48.5) % convert string to number: ['01'] -> [-1 1]
M = kron([eye(np)],M) % apply the kronecker tensor product
ind = reshape(1:nc*np,nc,np).'; % create an alternated index
M(ind(:),:) % index the matrix
对于转换,我使用了一个小技巧:'0'- 0 = 48
在 matlab 中,因为 matlab 承认隐式转换。所以matlab取字符'0'对应的ascii值为48.
结果:
M =
-1 -1 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 -1 -1 -1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 -1 -1 -1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1
-1 -1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 -1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 -1 -1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 1 1
要了解此答案的工作原理,您必须阅读一些有关以下内容的文档:kron
, cell2mat
, implicit casting,
matrix indexing and, if you don't know what it is, about the transpose operator .'