Заменить один элемент столбца на другой

Позволять A а также B быть столбцами векторов:

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 ответ

Проблема № 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

Затем вы можете заполнить массив, используя индекс цикла, чтобы получить ccell, вот так:

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 в остальной части кода.

Другие вопросы по тегам