【问题标题】:Exporting matrix with Logical indexing in Matlab在 Matlab 中使用逻辑索引导出矩阵
【发布时间】:2023-03-04 04:35:01
【问题描述】:

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

谁能帮帮我?谢谢

【问题讨论】:

    标签: matlab logical-operators


    【解决方案1】:

    虽然您可以在这个特定示例中使用@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 中的“默认”值不是 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 区分开来。

    【讨论】:

    • 这里必须注意声明B = zeros(size(A)) 是必需的,否则最终会得到一个向量。谢谢@Suever
    【解决方案2】:
    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 通过回答一个没有被问到的问题立即成为赞成票,只是因为它更长。

    我还将玩游戏并编辑我的答案:如果您想要其他默认选项然后 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 :)
    • 我会接受答案,但我通常允许人们回复。
    • @pkj:别忘了。不会再有其他答案了。所以赞成+接受。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多