Say that we have the following random matrix:
1 2 3 4
5 6 7 8
9 8 7 6
5 4 3 2
I'd like to transform it into the following:
1 0 2 0 3 0 4 0
0 0 0 0 0 0 0 0
5 0 6 0 7 0 8 0
0 0 0 0 0 0 0 0
9 0 8 0 7 0 6 0
0 0 0 0 0 0 0 0
5 0 4 0 3 0 2 0
0 0 0 0 0 0 0 0
For some reason I cannot use mathjax format so it looks a bit awful, sorry for this. Point, is, that I want to add row and columns of zeros in between of my current rows and columns so that I increase its size 2x.
I came up with the following code, but it only works for very small matrixes if i use it on a a big image it cannot finish due to memory limitation problems.
clear all
I=imread('image.png');
I=rgb2gray(I);
B=zeros(2*size(I));
[x, y]=find(-inf<I<inf);
xy=[x,y];
nxy=xy;
%coord change
nxy=2*xy-1;
B(nxy(:,1),nxy(:,2))=I(xy(:,1),xy(:,2));
I expected to be fast because it is fully vectorised with maltlab functions but it fails miserably. Is there some other elegant way to do this?
If you take a look at your indexing vectors, this is something like I([1 1 2 2] ,[1 2 1 2] );
for a 2x2 matrix which means you index each row and column twice. The right solution is B(1:2:end,1:2:end)=I;
which indexes every second row and every second column.
This can be also done via the one liner, say your original matrix is called A
, then
kron(A,[1,0;0,0])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With