开发者

MATLAB: concatenate 3 matrices into 1 new matrix with certain rule

3 matrices named as A, B and C. Each matrix have random M x N dimension. However, the N (column number) are equal. Randomly generate 1 row from each of the matrix and put into new matrix (named as Fdata) one by one, and then randomly generate 1 row from the each of the matrix again but can not be repeated from the previous randomly row generation and put into Fdata one by one again..do this accordingly...if one of the matrix is randomly generated once for each row without repeating, then the rest of the row can be randomly repeated again until the maximum rows from one of the matrix.

If A is matrix of 5x5, B is a matrix of 2x5 and C is the matrix of 3x5, the Fdata will be a 15x5 matrix

example:

A = 
6 6 4 7 8
4 7 1 6 9
3 5 8 0 1
6 5 8 1 2
9 4 2 0 1

B = 
4 7 2 8 5
5 6 0 1 2

C = 
1 6 4 5 1
8 6 7 1 3
3 0 4 5 8

The final data i wish to get is

Fdata = 
4 7 1 6 9 %randomly from matrix A
5 6 0 1 2 %randomly from matrix B
1 6 4 5 1 %randomly from matrix c
6 6 4 7 8 %randomly from matrix A (but not repeated from previ开发者_如何学Goous randomly generated row)
4 7 2 8 5 %randomly from matrix B (but not repeated from previous randomly generated row)
3 0 4 5 8 %randomly from matrix C (but not repeated from previous randomly generated row)
3 5 8 0 1 %randomly from matrix A (but not repeated from previous randomly generated row)
4 7 2 8 5 %randomly from matrix B, repeated row because the row of matrix B is fully randomly generated
8 6 7 1 3 %randomly from matrix C (but not repeated from previous randomly generated row)
9 4 2 0 1 %randomly from matrix A (but not repeated from previous randomly generated row)
....

what code shall i write to get the Fdata?


2nd question:

let say Fdata=xlsread('abc.xls,); original Fdata has 5x2 matrix, after some codes, Fdata become 5x5 matrix..then xlswrite('abc.xls',Fdata,'sheet2'); ..error occur...??? Index exceeds matrix dimensions...how can i solve this problem?


Quick working try, it can be optimized but then a few more details are needed: how many iterations are you doing ? is there a breaking condition ? Will you always use three matrices to feed Fdata ?

Here is a working sample of code:

function Fdata=buildFdata
A=rand(5,5);
B=rand(2,5);
C=rand(3,5);
selectedA=[];
selectedB=[];
selectedC=[];
n=max([size(A,1) size(B,1) size(C,1)]);
Fdata=zeros(3*n,5);
for i=1:3:3*n-2
    [Fdata,A,selectedA]=randomfeed(Fdata,A,selectedA,i);
    [Fdata,B,selectedB]=randomfeed(Fdata,B,selectedB,i+1);
    [Fdata,C,selectedC]=randomfeed(Fdata,C,selectedC,i+2);
end
end

function [Fdata,Mat,selectedMat]=randomfeed(Fdata,Mat,selectedMat,i)
if(~isempty(Mat))
    index=randline(size(Mat,1));
    Fdata(i,:)=Mat(index,:);
    selectedMat(end+1,:)=Mat(index,:);
    Mat(index,:)=[];
else
    index=randline(size(selectedMat,1));
    Fdata(i,:)=selectedMat(index,:);
end    
end

function n=randline(nlines)
if(nlines==1)
    n=1;
else
    n=randi(nlines-1)+1;
end
end
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜