我试图将矩阵的逻辑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
任何人都可以帮助我吗?感谢
答案 0 :(得分:1)
虽然你可以使用@ tim的方法来解决这个具体的例子,但更通用的解决方案是使用逻辑数组来索引你从和中检索值的内容。您要分配的阵列。这会抓取A
中TRUE
位置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.