【问题标题】:Changing elements of two matrix in a condition matlab在条件matlab中更改两个矩阵的元素
【发布时间】:2017-05-26 04:46:20
【问题描述】:

考虑两个 n × n-1 矩阵和一个 n × 1 向量(例如,让我们按 A、B 和 v 的顺序调用它们)。 v 的元素为零或一。如果元素 v(m,1) 等于一,我想用 B(1:m-1,m-1) 和元素 A(m+1) 替换元素 A(1:m-1,m-1) :n,m) 乘 B(m+1:n,m)。 我怎样才能做到这一点?有人可以帮忙吗?为了使问题更清楚,请考虑以下示例。

示例:

A=[1,2,3;4,5,6;7,8,9;12,13,14]
B=[3,4,5;6,7,8;9,10,11;6,5,3]
v=[0,1,0,1]

结果应该是:

结果= [3,2,5;4,5,8;7,10,11;12,5,14]

【问题讨论】:

  • 您的 v 是 4 个元素,A 和 B 是 4x3。所以当 v(4)=1 时 A(m+1:n,m) 超出范围。
  • 是的 v 有 4 个元素,所以不应该考虑与 A(4+1:n,4) 相关的第二个变化。结果我放了节目

标签: matlab matrix


【解决方案1】:

这是一个替代方案,使用逻辑索引:

temp = A;
ind = 1:size(v,2);
for k = ind(v==1)
    if k<=size(A,2)+1
        A(1:k-1,k-1) = B(1:k-1,k-1);
        B(1:k-1,k-1) = temp(1:k-1,k-1);
        if k<size(A,2)
            A(k+1:end,k) = B(k+1:end,k);
            B(k+1:end,k) = temp(k+1:end,k);
        end
    end
end

【讨论】:

    【解决方案2】:

    您可以使用find(返回非零元素的索引)和for-loop 来获得所需的结果:

    R = A; % assuming you've set A, B and v already.
    n = size(A,1);
    v1 = find(v);
    for i=1:length(v1)
         m=v1(i);
         if m>1
         R(1:m-1,m-1)=B(1:m-1,m-1);
         end
         if m<n
             R(m+1:end,m)=B(m+1:end,m);
         end
    end
    

    正如我在评论中指出的那样,v 的长度必须为 n-1,如果 v(n-1)=1 否则 m+1:end 不是有效的索引范围。

    根据 cmets 进行编辑以选择性地进行第二次分配。

    【讨论】:

    • 在 v(n) =1 的情况下,(如我带来的示例),矩阵 A 中没有元素 n+1 并且替换第一个条件(替换元素 A(1:m-1,m-1) 由 B(1:m-1,m-1))。所以 v 是一个 n×1 的向量。清楚吗?请看例子。如果不清楚,请告诉我
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2015-01-06
    • 2015-01-24
    相关资源
    最近更新 更多