在 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
.
区分开来
我试图将矩阵的逻辑 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
.