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

Exporting matrix with Logical indexing in Matlab

我试图将矩阵的逻辑 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

谁能帮帮我?谢谢

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


编辑

我担心 Whosebug 变成了一个页面,每个人都试图通过尝试做出更长更详细的答案来击败其他人的答案,即使与最初提出的问题无关。而不是那些在短时间内针对特定问题给出快速、简单、简单的解决方案的方法。 Suever 通过回答一个没有被问到的问题立即成为赞成票,只是因为它更长。

我也会玩游戏修改我的答案:如果你想有其他默认选项然后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.

虽然您可以对这个特定示例使用@tim 的方法,但更通用的解决方案是使用逻辑数组来索引您从 中检索值的内容你分配到的数组。这会在 I 中的 TRUE 位置获取 A 中的值,并将它们放入 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 中的 "default" 值不是 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.

区分开来