I have huge data matrices stored in a MATLAB M-file and I will explain
my problem by this sample example:
I have three constant matrices (every matrix has its own values and these
values are not changed, they are values for experiment results)
Every matrix always has 4 rows and 6 columns
The last column of the 1st matrix is a zero column
The 2nd matrix does not have any zero column
The last 2 columns of the 3rd matrix are zeros
Actually, I have other matrices but the above are only samples, meaning
that the next three matrices in my data do not have to be in the same sequence 开发者_如何学Pythonof the
above three matrices in case of having or not having zero columns. Another point is
the non zero columns are always at the last three or two or one column or there is no
zero column.
So, what I need from the above matrices is assigning three letters x, y and z OR
numbers 5, 6 and 7 to the nonzero columns only, starting from the 1st column of
matrix 1 continuing to the last column of the last matrix excluding the zero columns
meaning that: the above example results will be:
1st matrix:
Column 1: 5
Column 2: 6
Column 3: 7
Column 4: 5
Column 5: 6
Column 6: excluded and not numbered since it is a zero column
Then it does not reset the counting, but it continuous labeling and jumps to the
next matrix, so:
2nd matrix
Column 1: 7
Column 1: 5
.
.
.
.
And so on continuing to the last matrix.
I am using the following command that appears in the Matlab window:
K=input('Enter the matrix number: 1 OR 2 OR 3')
Then, after entering the matrix number, the program asks the user to
enter the column number:
M=input('Enter the column number 1 OR 2 OR 3 OR 4 OR 5 OR 6')
Then, the result will be a matrix of two columns:
1st column: the column elements for the number entered
2nd column: the assigned number 5 OR 6 OR 7 to this column and for sure it is
repeated through the column.
Sorry for this long question and also I tried to summarize and make it simple as I can.
I appreciate any help and thanks.
Can I ask a question continuing to the above one ?
If someone wants to represents the numbers by text, is it possible?
this means, for example:
5 : green
6 : blue
7 : red
and then, continue as above analysis.Only, replacing the numbers by these words
so, the results in the 2nd column will be words other than numbers.
Sorry for putting my question in an answer box, but I couldn't comment
to this question..
I hope you keep all your matrices in one variable. It will allow you not to repeat the same commands for different matrices or to use eval
.
Let's say you have 3 matrices:
% sample data
A1 = horzcat(rand(4,5),zeros(4,1));
A2 = rand(4,6);
A3 = horzcat(rand(4,4),zeros(4,2));
You can combine them as a cell array:
A = {A1,A2,A3};
or 3D array (since all matrices have the same size):
A = cat(3,A1,A2,A3);
Create combined matrix B with 4 rows and (6+6+6) columns
% combined matrix for cell array
B = cell2mat(A);
% or for 3D array
B = reshape(A,4,[]);
Then you can use the following code to repopulate B with 5 6 and 7:
% repopulate B with 5, 6, 7
zerocolumns = all(B==0,1); % index of columns with all zeros
vec567 = repmat(5:7,1,ceil(sum(~zerocolumns)/3)); % vector 5 6 7 5 6 7 ...
B(:,~zerocolumns) = repmat(vec567(1:sum(~zerocolumns)),size(B,1),1);
Split B back to original matrices:
% convert back to cell array
C = mat2cell(B,[],4, [6 6 6]);
% convert back to 3D array
C = reshape(B,4,6,[]);
Finally you can get 2-column output as
% cell arrays
result = [A{K}(:,M) C{K}(:,M)];
% 3D arrays
result = [A(:,M,K) C(:,M,K)];
If you don't need to repopulate original matrices you can get the result earlier:
% cell arrays
result = [A{K}(:,M) B(:,(K-1)*6+M)];
% 3D arrays
result = [A(:,M,K) B(:,(K-1)*6+M)];
Hope I didn't make a mistake somewhere.
It probably can be solved without creating combined matrix. But your matrices are small and there should not be any memory or performance related problems.
精彩评论