在矩阵

时间:2017-10-03 02:18:35

标签: matlab

我知道标题令人困惑,但我无法想出更好的解释方法。基本上,为了示例,我有一个1和0的矩阵:

a = [1 0 1 0 1 1 0 0];

我想得到的是:

if (a == 1)
    a (that index) = [1 0]
if (a == 0)
    a (that index) = [-1 0]

这样:

a = [1 0 -1 0 1 0 -1 0 1 0 1 0 -1 0 -1 0]

我似乎无法找到一种方法,因为matlab不会让我将单个索引设置为大于单个数字的东西(有意义)。

到目前为止,我已尝试过(有一些小的语法变体):

SM = [[1, 0]; [-1, 0]];
a = SM(a + 1);

使用旧版代码的内容:

SM = [1, -1];
a = SM(a + 1);

正常运作

有没有办法在没有先构建一个大小合适的数组并将其填入循环的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

@ nalyd88的回答是正确的,但我认为这里不需要使用细胞。另一种解决方案可以是:

a = [1 0 1 0 1 1 0 0]
b=zeros(1,length(a)*2);
b(find(a)*2-1)=1;
b(find(~a)*2-1)=-1

b =

 1     0    -1     0     1     0    -1     0     1     0     1     0    -1     0    -1     0

一行的整齐解决方案是kron,这有点难以阅读或理解,但这些问题尤其适用于此功能......

b=kron(a,[1 0])+kron(~a,[-1 0])
b =

 1     0    -1     0     1     0    -1     0     1     0     1     0    -1     0    -1     0

答案 1 :(得分:0)

这会解决您的问题吗?

a = [1 0 1 0 1 1 0 0];
b = num2cell(a);      % Convert to cell array (each value is a cell)
b(a == 1) = {[1 0]};  % Replace ones (logical indexing)
b(a == 0) = {[-1 0]}; % Replace zeros (logical indexing)
cell2mat(b)           % Flatten back into a vector.

输出结果为:

ans =

     1     0    -1     0     1     0    -1     0     1     0     1     0    -1     0    -1     0