在Matlab中使用逻辑索引导出矩阵

时间:2016-06-03 17:14:44

标签: matlab logical-operators

我试图将矩阵的逻辑1索引导出到另一个变量而不改变它们的位置。下面我试图用一个例子来解释我的疑问:

l = logical([1 0 1 1 ;...
             1 1 1 0]);

A = [1 2 3 4;...
     5 6 7 8];

B = zeros(size(A));
B = A(l)

产生

 B =

     1
     5
     6
     3
     7
     4

但我感兴趣的是

B =

 1     0     3     4
 5     6     7     0

任何人都可以帮助我吗?感谢

2 个答案:

答案 0 :(得分:1)

虽然你可以使用@ tim的方法来解决这个具体的例子,但更通用的解决方案是使用逻辑数组来索引你从中检索值的内容。您要分配的阵列。这会抓取ATRUE位置I中的值,并将它们放入B中的相应位置。

I = logical([1 0 1 1; 1 1 1 0]);
A = [1 2 3 4; 5 6 7 8];

B = zeros(size(A));
B(I) = A(I);

如果您想要"默认"元素乘法方法不会起作用。 B中的值为0以外的任何值。例如。

% Initialize B to an array of 100's
B = 100 * ones(size(A));

% Replace the elements specified by the logical array
B(I) = A(I);

%   1   100     3     4
%   5     6     7   100

或者,如果您只想将A中的值清零,您也可以使用逻辑索引来执行此操作。

A(~I) = 0;

作为旁注,请尽量避免将l用于变量名称,因为很难将l与数字1区分开来。

答案 1 :(得分:0)

l = logical([1 0 1 1 ;...
             1 1 1 0]);

A = [1 2 3 4;...
     5 6 7 8];

A .* l % element-wise multiplication

没有概率,欢迎你;-)接受,问题关闭!的xD

修改

我害怕Stackoverflow成为一个页面,每个人都试图通过尝试做出更长更详细的答案来试图击败其他人的答案,即使与原来提出的问题无关。而不是那些在短时间内提供快速,简单,简单的解决方案的人,而不是那个特定的问题。通过回答一个未被问到的问题,Suever立即成为一个upvote,因为它更长。

我也会玩游戏并编辑我的答案:如果你想要其他默认选项然后0,我们也可以采用我的解决方案并使用:

~l*default_value + A.*l

我只想说:这是可能的。

<强> EDIT2

tic; 
for i = 1:1000000
  B = A.*l; 
end; 
toc
>> Elapsed time is 2.18214 seconds.

tic; 
for i = 1:1000000
  B=zeros(size(A)); 
  B(l)=A(l); 
end; 
toc
>>Elapsed time is 13.9691 seconds.

自己选择。

EDIT3 (默认值!= 0)

>> tic; for i = 1:1e6; B = A.*l+100*(~l); end; toc
Elapsed time is 4.17261 seconds.
>> tic; for i = 1:1e6; B=100*ones(size(A)); B(l)=A(l); end; toc
Elapsed time is 14.2126 seconds.