Combining text with non-zero elements of a 2D array

조회 수: 2 (최근 30일)
Saeid
Saeid 2024년 9월 16일
댓글: Saeid 2024년 9월 16일
I have a numerical array that is "almost" diagonal, so it looks like this:
N=[10 0 0 0 0; 0 20 0 0 0; 10 0 20 0 0; 0 0 0 10 0; 0 0 0 0 30]
N = 5×5
10 0 0 0 0 0 20 0 0 0 10 0 20 0 0 0 0 0 10 0 0 0 0 0 30
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
I also have a cell array with the same number of rows, which looks like this:
C={'ABC';'DEF';'GHI';'JKL';'MNO'}
C = 5x1 cell array
{'ABC'} {'DEF'} {'GHI'} {'JKL'} {'MNO'}
I would like to create a row array that takes the non-zero values of N, and combines them with the text in C to give an output like this:
CN={'ABC10_GHI10' 'DEF20' 'GHI10' 'JKL10' 'MNO30'}
CN = 1x5 cell array
{'ABC10_GHI10'} {'DEF20'} {'GHI10'} {'JKL10'} {'MNO30'}
In other words, it must combine all the non-zero values of each column with text of respective indices.

채택된 답변

Stephen23
Stephen23 2024년 9월 16일
Without an intermediate matrix:
N = [10,0,0,0,0;,0,20,0,0,0;,10,0,20,0,0;,0,0,0,10,0;,0,0,0,0,30]
N = 5×5
10 0 0 0 0 0 20 0 0 0 10 0 20 0 0 0 0 0 10 0 0 0 0 0 30
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
C = {'ABC';'DEF';'GHI';'JKL';'MNO'}
C = 5x1 cell array
{'ABC'} {'DEF'} {'GHI'} {'JKL'} {'MNO'}
[X,Y,V] = find(N);
F = @(x)cellstr(join(""+C(X(x))+V(x),'_'));
Z = 1:numel(X);
CN = accumarray(Y,Z(:),[],F)
CN = 5x1 cell array
{'ABC10_GHI10'} {'DEF20' } {'GHI20' } {'JKL10' } {'MNO30' }

추가 답변 (2개)

Voss
Voss 2024년 9월 16일
편집: Voss 2024년 9월 16일
Here's one way:
N=[10 0 0 0 0; 0 20 0 0 0; 10 0 20 0 0; 0 0 0 10 0; 0 0 0 0 30]
N = 5×5
10 0 0 0 0 0 20 0 0 0 10 0 20 0 0 0 0 0 10 0 0 0 0 0 30
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
C={'ABC';'DEF';'GHI';'JKL';'MNO'}
C = 5x1 cell array
{'ABC'} {'DEF'} {'GHI'} {'JKL'} {'MNO'}
n_col = size(N,2);
tmp = compose('%s%d',string(C),N)
tmp = 5x5 cell array
{'ABC10'} {'ABC0' } {'ABC0' } {'ABC0' } {'ABC0' } {'DEF0' } {'DEF20'} {'DEF0' } {'DEF0' } {'DEF0' } {'GHI10'} {'GHI0' } {'GHI20'} {'GHI0' } {'GHI0' } {'JKL0' } {'JKL0' } {'JKL0' } {'JKL10'} {'JKL0' } {'MNO0' } {'MNO0' } {'MNO0' } {'MNO0' } {'MNO30'}
CN = cell(1,n_col);
idx = N ~= 0;
for ii = 1:n_col
CN{ii} = strjoin(tmp(idx(:,ii),ii),'_');
end
disp(CN)
{'ABC10_GHI10'} {'DEF20'} {'GHI20'} {'JKL10'} {'MNO30'}

Voss
Voss 2024년 9월 16일
편집: Voss 2024년 9월 16일
Here's one way:
N=[10 0 0 0 0; 0 20 0 0 0; 10 0 20 0 0; 0 0 0 10 0; 0 0 0 0 30]
N = 5×5
10 0 0 0 0 0 20 0 0 0 10 0 20 0 0 0 0 0 10 0 0 0 0 0 30
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
C={'ABC';'DEF';'GHI';'JKL';'MNO'}
C = 5x1 cell array
{'ABC'} {'DEF'} {'GHI'} {'JKL'} {'MNO'}
n_col = size(N,2);
tmp = compose("%s%d",string(C),N)
tmp = 5x5 string array
"ABC10" "ABC0" "ABC0" "ABC0" "ABC0" "DEF0" "DEF20" "DEF0" "DEF0" "DEF0" "GHI10" "GHI0" "GHI20" "GHI0" "GHI0" "JKL0" "JKL0" "JKL0" "JKL10" "JKL0" "MNO0" "MNO0" "MNO0" "MNO0" "MNO30"
CN = strings(1,n_col);
idx = N ~= 0;
for ii = 1:n_col
CN(ii) = join(tmp(idx(:,ii),ii),'_');
end
disp(CN)
"ABC10_GHI10" "DEF20" "GHI20" "JKL10" "MNO30"
CN = cellstr(CN)
CN = 1x5 cell array
{'ABC10_GHI10'} {'DEF20'} {'GHI20'} {'JKL10'} {'MNO30'}

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

제품


릴리스

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by