Заменить один элемент столбца на другой
Позволять 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
1 ответ
Проблема № 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
матрица, следующим образом:
куда 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
(" length(C)
"). Это гарантирует, что вы не получите доступ к блокам вне вашей квадратной матрицы. Например:
newIdx = index(1:numel(A));
Тогда просто используйте newIdx
вместо index
в остальной части кода.