【问题标题】:Copy element of matrix to a vector MATLAB将矩阵元素复制到向量 MATLAB
【发布时间】:2017-01-09 00:55:11
【问题描述】:

假设我们有一个矩阵 A (2x5),第一行包含数字:

1 2 3 5 7

第二行:

0.4 0.1 0.2 0.1 0.2

此外,还有一个 10 维向量 B,其数字为 1,2,3...10。 如何创建一个新的 10 维向量 C,当 A(1,:) == B 时,它只包含 A(第二行)的值,否则为 0。

所以新的向量 C 应该是这样的:

0.4 0.1 0.2 0 0.1 0 0.2 0 0 0 

(为 B 中不在 A 中的单元格添加零)。

我尝试了这个解决方案,但由于 A 和 B 之间的尺寸差异,我遇到了问题。

for i=1:53
    if B(i) == A(1,i)
        C{1,i} = A(2,i);
    else
        C{1,i}=0;
    end
end 

索引超出矩阵维度。

【问题讨论】:

    标签: matlab matrix vector mapping


    【解决方案1】:

    不是很清楚你在追求什么,但这至少给出了想要的输出:

    A = [1 2 3 5 7; 0.4 0.1 0.2 0.1 0.2];
    B = 1:10;
    [tf,loc] = ismember(A(1,:), B);
    C = zeros(1,10);
    C(loc(tf)) = A(2,tf)
    

    [我假设你的意思是 10 个 element 向量,而不是 10 个 dimensional...]

    如果你只想使用A 的第一行作为索引,第二行作为赋值,那么你根本不需要使用B,你可以这样做:

    A = [1 2 3 5 7; 0.4 0.1 0.2 0.1 0.2];
    C = zeros(1,10);
    C(A(1,:)) = A(2,:)
    

    【讨论】:

    • 第二个答案是错误的,因为您将 A 值视为 C 的索引,而它们需要被视为针对 C 的值,例如使用这个答案A = [2 3 5 7 11; 0.4 0.1 0.2 0.1 0.2] 最终会得到 `[0 0.4 0.1 0 0.2 0 0.1 0 0 0 0.2] ,它有 11 个维度。另外,如果你改变A(1,:)的元素顺序,会产生不同的结果!
    • @hmofrad - 正如我在第二个答案之前明确说过的那样:“如果你只想使用 A 的第一行作为索引,第二行作为分配值......”问题不是很清楚,因此两个答案。
    【解决方案2】:

    如何删除for loop 并使用ismember 函数内联:

    A = [1 2 3 5 7; 0.4 0.1 0.2 0.1 0.2];
    B = 1:10;
    C = zeros(1,10);
    C(B(ismember(B, A(1,:)))) = A(2,ismember(A(1,:),B));
    

    提示:即使我们碰巧在A(1,:) 中有一个B 没有的值,这个解决方案也可以工作。

    【讨论】:

      【解决方案3】:

      使用ismemberfor 循环:

      clc; clear;
      
      A=[
          1 2 3 5 7;
          0.4 0.1 0.2 0.1 0.2
        ];
      
      B = 1:10;
      
      C = zeros(1,10);
      for j = 1:10
          if ismember(j, A(1,:))
                  C(j) = A(2, A(1,:) == j);
          else
              C(j) = 0;
          end
      end
      C
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多