Efficiently add cell value from a matrix row based on corresponding index to another matrix row
이전 댓글 표시
Column 1 of array A contains the index number of the samples; other columns of matrix A contain other attributes of each sample, (in array B, the first two cell along each row contain an attribute and the index number of a sample). when I have one thousand rows, it becomes inefficient to use the code below. Please is there a more efficient way to write the code such that one does not have to input the thousands of numbers in the code.
Columns 2, 4 and 6 of array B contain the index number of samples contained in matrix A. I am trying to insert corresponding sample attribute in column 4 of array A (based on corresponding index number in array A and B) into new 3rd, 6th and 9th column of matrix B; to have matrix C as shown below:
A = [1,3.43,2.34,5.43,3.22;
2,8.32,6.34,7.34,2.34;
3,3.67,8.34,8.23,1.34;
4,2.67,6.89,4.99,8.65;
5,1.33,5.42,2.53,6.13];
B = [0.12,2,0.15,1,0.65,3;
0.33,5,0.62,4,0.55,1;
0.91,1,0.77,2,0.66,5];
The code below works but with over a thousand column, it becomes inefficient to write all the numbers in line 2 of the code below:
I am trying to write a code that does not require one to write all the numbers of the columns as in line 2 of the code below.
I get reasonable result with this code but having to type millions of numbers for every run makes it inefficient.
Z = [0;0;0];
C = [[B(:,1:2) Z B(:,3:4) Z B(:,5:6)]]; %Generating satic part
for j = 1:3 %generating dynamic part in loop
for i = 1:3
n = A(find(ismember(A(:,(1)), B(i,j*2), 'rows')),4);
C(i,j*3) = n;
end
end
채택된 답변
추가 답변 (1개)
Allen
2019년 8월 24일
It looks as if every other column of B is a row index corresponding the the rows of A. It also appears that C consists of pairs of columns from B followed by a new column, where this new column is equal to the 4th column of A at the row index in every other column of B. If this is correct then the sample code below should work with larger sized columns using the same pattern.
% Preallocate C with same #rows as B, but with 1 addtional column for every 2 columns in B
[r,c] = size(B);
C = zeros([r,3*c/2]);
for i = 1:c/2 % Loops through each pair of columns in B
C(:,3*i-2:3*i) = [B(:,2*i-1:2*i),A(B(:,2*i),4)];
end
There is likely a better method yet by using vectorized indexing, but this should be considerably more efficient.
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!