让A
和B
成为列向量:
A = (1:6).'; %'// [1;2;3;4;5;6]
B = (7:12).'; %'// [7;8;9;10;11;12]
如何构建矩阵,以便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];
如果要将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
答案 0 :(得分:2)
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
据我了解,您希望以下列方式从以前找到的C
矩阵中提取块:
c1
,c2
,c3
分别为绿色,红色和蓝色块;并且"失踪"元素将替换为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
。