开发者

Matrices extracting and assigning numbers or symbols

开发者 https://www.devze.com 2023-01-23 10:03 出处:网络
I have huge data matrices stored in a MATLAB M-file and I will explain my problem by this sample example:

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号