2017-05-26 114 views
0

考虑两个n乘n-1矩阵和n乘1的矢量(例如,让我们按顺序A,B和v调用它们)。 v的元素是零或一个。如果元素v(m,1)等于1,我想用B(1:m-1,m-1)和元素A(m + 1)替换元素A :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]

+0

你'v'为4种元素以及A和B都是4×3。所以当v(4)= 1时,A(m + 1:n,m)超出范围。 – jarmond

+0

是v有4个元素,所以不应该考虑与A(4 + 1:n,4)相关的第二个变化。因为我在v(n)= 1的情况下(如在我带来的例子中)放置了 –

回答

0

下面是一个替代方案中,使用逻辑索引:

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 
0

可以acheive使用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不是有效的索引范围。

编辑后根据意见进行第二次分配。

+0

的结果,所以在矩阵A中没有元素n + 1,并且它足以代替第一个条件用B(1:m-1,m-1)替代元素A(1:m-1,m-1))。所以v是一个n乘1的向量。清楚吗?请看这个例子。如果它不清楚,请告诉我 –