Need algorithm to create the list
1 次查看(过去 30 天)
显示 更早的评论
Hello,
I need to create a matrix of order 1614006*3, The sequence should be
1st Col (origin) , 2nd Col (Destination) , 3rd Col (Survey_Location)
Origin (1) Destination(1) Survey_Location(1)
Origin (1) Destination(1) Survey_Location(2)
.......
Origin (1) Destination(1) Survey_Location(246)
Origin (1) Destination(2) Survey_Location(1)
...........
Origin (1) Destination(81) Survey_Location(246)
......
Origin (2) Destination(1) Survey_Location(1)
.........
Origin (81) Destination(81) Survey_Location(246)
For this case rows should be 81*81*246=1614006
采纳的回答
Image Analyst
2014-7-6
编辑:Image Analyst
2014-7-6
I'm sure there's a more clever vectorized way - Andrei can probably do it in a single line! - but there's always the brute force way:
Origin = randi(9, [81, 1]);
Destination = randi(9, [81, 1]);
Survey_Location = randi(9, [246, 1]);
numOutputRows = size(Origin, 1) * size(Destination, 1) * size(Survey_Location, 1)
output = zeros(numOutputRows, 3);
tic;
row = 1;
for r1 = 1 : size(Origin, 1)
for r2 = 1 : size(Destination, 1)
for r3 = 1 : size(Survey_Location, 1)
output(row, :) = [Origin(r1), Destination(r2), Survey_Location(r3)];
row = row + 1;
end
end
end
toc
Takes 1.4 second on my computer.
5 个评论
Image Analyst
2014-7-6
Oh, I thought you already had some arrays so I just used sample arrays. If you want sequential arrays, you can do
Origin = (1:81)';
Destination = (1:81)';
Survey_Location = (1:246)';
更多回答(2 个)
Andrei Bobrov
2014-7-6
[z,y,x] = ndgrid(Survey_Location,Destination,Origin);
out = [x(:),y(:),z(:)];
3 个评论
Cedric
2014-7-6
编辑:Cedric
2014-7-6
Hello Muhammad,
Here is an example, with 3 elements Origin and Destination, and a 4 elements Survey_Location..
% - Dummy test case.
Origin = 10 : 12 ;
Destination = 100 : 102 ;
Survey_Location = [500, 600, 700, 800] ;
% - Define columns of final array and concatenate.
c1 = reshape( repmat( Origin(:)', 3*4, 1 ), [], 1 ) ;
c2 = repmat( reshape( repmat( Destination(:)', 4, 1 ), [], 1 ), 3, 1 ) ;
c3 = repmat( Survey_Location(:), 3*3, 1 ) ;
X = [c1, c2, c3] ;
Running this, you get
>> X
X =
10 100 500
10 100 600
10 100 700
10 100 800
10 101 500
10 101 600
10 101 700
10 101 800
10 102 500
10 102 600
10 102 700
10 102 800
11 100 500
11 100 600
11 100 700
11 100 800
11 101 500
11 101 600
11 101 700
11 101 800
11 102 500
11 102 600
11 102 700
11 102 800
12 100 500
12 100 600
12 100 700
12 100 800
12 101 500
12 101 600
12 101 700
12 101 800
12 102 500
12 102 600
12 102 700
12 102 800
EDIT : for your case, you want to replace 3 by 81, and 4 by 246.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!