Matthew
Matthew

Reputation: 11

2d matrix to a 3d matrix without using a loop

I have a 300x300 matrix. I need to make a 300x300x1024 matrix where each "slice" is the original 300x300 matrix. Is there any way to do this without a loop? I tried the following:

old=G;

for j=2:N;

    G(:,:,j)=old;

end

where N is 1024, but I run out of memory.

Know any shorter routes?

Upvotes: 1

Views: 5032

Answers (3)

Kyle Heuton
Kyle Heuton

Reputation: 9768

You are likely running out of memory because you haven't pre-initialized your matrix.

if you do this first,

old = G;
G = zeros(size(old,1), size(old,2), 1024);

and then start the loop from 1 instead of 2, you will probably not run out of memory

Why this works is because you first set aside a block of memory large enough for the entire matrix. If you do not initialize your matrix, matlab first sets aside enough memory for a 300x300x1 matrix. Next when you add the second slice, it moves down the memory, and allocates a new block for a 300x300x2 matrix, and so on, never being able to access the memory allocated for the first matrices.

This occurs often in matlab, so it is important to never grow your matrices within a loop.

Upvotes: 0

bla
bla

Reputation: 26069

use repmat.

B = repmat(A,[m n p...]) 

produces a multidimensional array B composed of copies of A. The size of B is [size(A,1)*m, size(A,2)*n, size(A,3)*p, ...].

In your case ,

G=repmat(old,[1 1 1024]);

Will yield the result you wanted without the for loop. The memory issue is a completely different subject. A 300x300x1024 double matrix will "cost" you ~740 MB of memory, that's not a lot these days. Check your memory load before you try the repmat and see why you don't have these extra 700 MB. use memory and whos to see what is the available memory and which variables can be cleared.

Upvotes: 4

Bill K
Bill K

Reputation: 62769

Quick answer is no, you will need to loop.

You might be able to do something smart like block-copying your array's memory but you didn't even give us a language to work with.

You will probably want to make sure each entry in your matrix is a minimum size, even at byte matrix size you will require 92mb, if you are storing a 64bit value we're talking nearly a gig. If it's an object your number will leap into the many-gig range in no time. Bit packing may come in handy... but again no idea what your other constraints are.

Edit: I updated your tags.

I'm not sure if I can help much, but doubles are 64bits each so at bare minimum you're talking about 2gb (You're already past impossible if you are on a 32 bit os). This could easily double if each cell involves one or two pointers to different memory locations (I don't know enough about matlab to tell you for sure).

If you're not running on an 8gb 64 bit machine I don't think you have a chance. If you are, allocate all the memory you can to matlab and pray.

Sorry I can't be of more help, maybe someone else knows more tricks.

Upvotes: -1

Related Questions