替换另一个列中的一个元素

时间:2015-12-04 11:22:17

标签: matlab matrix replace elements diagonal

AB成为列向量:

A = (1:6).';  %'// [1;2;3;4;5;6]   
B = (7:12).'; %'// [7;8;9;10;11;12]
  1. 如何构建矩阵,以便A的一个元素每次都被B中的元素替换为C

    C = [... 
    7   1   1   1   1   1
    2   8   2   2   2   2
    3   3   9   3   3   3
    4   4   4   10  4   4
    5   5   5   5   11  5
    6   6   6   6   6   12];
    
  2. 如果要将C编入索引index = [1 1 1 2 2 3 3]',如何生成

    c1 = [...
    1   7   1   1
    1   2   8   2
    1   3   3   9];
    
    c2 = [...
    2   10  4
    2   5   11]; 
    
    c3 = [3 6];  %// either this
    c3 = [3 12]; %// or this
    

1 个答案:

答案 0 :(得分:2)

问题#1:

C = bsxfun(@plus,A.',-diag(A)+diag(B));

给出:

 7     2     3     4     5     6
 1     8     3     4     5     6
 1     2     9     4     5     6
 1     2     3    10     5     6
 1     2     3     4    11     6
 1     2     3     4     5    12

问题#2:

据我了解,您希望以下列方式从以前找到的C矩阵中提取块:

Desired output (?)

c1c2c3分别为绿色,红色和蓝色块;并且"失踪"元素将替换为NaN(在问题的初始版本中)。

index = [1 1 1 2 2 3 3]; %// Block definition
[blkSz,~] = histcounts(index,numel(unique(index))); %// Conversion...
paddedC = padarray(C,numel(index)-numel(diag(C))*[1 1],NaN,'post');
blocks = mat2cell(paddedC,blkSz,blkSz);

这会产生一个包含以下内容的单元格数组blocks

blocks = 

    [3x3 double]    [3x2 double]    [3x2 double]
    [2x3 double]    [2x2 double]    [2x2 double]
    [2x3 double]    [2x2 double]    [2x2 double]

例如blocks{1,1}的位置:

ans =

     7     2     3
     1     8     3
     1     2     9

然后你可以使用循环索引填充数组,得到c cell ,如下所示:

c = cell(numel(blkSz),1); %// Preallocation
for ind1 = 1:numel(blkSz)
  c{ind1} = padarray(blocks{ind1,ind1},1,ind1,'pre');
end

请注意,在c1

中可以找到c{1}

<强>增加:

如果您不希望c1...c3(可能)填充NaN,我认为最好的方法是将索引向量修剪为A的长度或B(&#34; length(C)&#34;)。这可以确保您不会访问方阵外的块。例如:

newIdx = index(1:numel(A)); 

然后在其余代码中使用newIdx代替index