Here is my code which when run makes the matlab show busy since hours. What can be wrong? My data is big though!
Y = importdata('Dr_Kucukvar_data.xlsx');
linverse = importdata('L_inverse.txt');
X= Y.data.Diagonal;
mlinverse_1 = X(:,1);
mlinverse_1 = diag(mlinverse_1);
mlinverse_2 = X(:,2);
mlinverse_2 = diag(mlinverse_2);
mlinverse_3 = X(:,3);
mlinverse_3 = diag(mlinverse_3);
mlinverse_4 = X(:,4);
mlinverse_4 = diag(mlinverse_4);
mlinverse = [mlinverse_1 mlinverse_2 mlinverse_3 mlinverse_4];
Result_matrix = zeros(7824,1);
for i= 1:4
u= 7824*(i-1)+1;
g= u +7823;
for j= 0:26
for k= 96:107
h= 163*j + k;
z= zeros(7824,1);
z(h)= 1;
S = mlinverse(:,u:g) * linverse * z;
Result_matrix = [Result_matrix S];
end
end
end

3 Comments

What can be wrong? Big problems take big time. Whether your code actually does what you think it does, that is another question, since we cannot know what it is you really want to do.
Muhammad - look at the innermost loop iterating over k
h= 163*j + k;
z= zeros(7824,1);
z(h)= 1;
So on every iteration, you are re-creating z to be a 7824x1 array just to set one element, z(h), to one. Why? Is this intended?
Thank you so much Geoff. Stafford's code below really worked!

Sign in to comment.

 Accepted Answer

Your method of appending columns to 'Result_matrix' is very time consuming. Also as Geoff points out, your creation of a new 'z' matrix each time in the inner loop is very inefficient. I suggest you alter your code as follows:
......
Result_matrix = zeros(7824,1297); % 1297 = 4*27*12+1
c = 1;
for i= 1:4
u= 7824*(i-1)+1;
g= u +7823;
for j= 0:26
for k= 96:107
h= 163*j + k;
S = mlinverse(:,u:g) * linverse(:,h);
c = c+1;
Result_matrix(:,c) = S;
end
end
end
This should give you the same result and be considerably faster.
Final note: Do you really want the first column of Result_matrix to be all zeros?

4 Comments

Thankyou so much Stafford. It really worked. I am your fan now. I dint want to add zeroa u pointed it out right!
Mine is taking way tooo long too is there any problem?
Nex = 1000000000;
e = exp(1);
sol_err = [];
for n = 1:Nex
en = ((1+(1/n))^n);
sol_err = [sol_err abs(e-en)/abs(e)];
end
figure(1); clf;
semilogy(sol_err,'LineWidth',2)
Preallocation will help, but this is also a problem that can be easily vectorized (unless this is a homework problem where you're required to use a for loop, in which case do preallocate as Stephen suggested.) See the Array Operations section on that page for an example that looks somewhat like the problem you're trying to solve.
I vectorized the code and the computation piece took under a minute on my machine, most of which was probably spent allocating the three 8 GB arrays needed to store n, en, and sol_err. I didn't let the plotting finish, since that's a lot of data to plot. It's probably more data points than you have pixels on your screen, so you might want to plot only every thousandth point or something. Or you could divide your upper limit Nex by a thousand or something. When I used Nex = 1000000 the whole operation was done in a couple seconds.

Sign in to comment.

More Answers (0)

Categories

Find more on Programming in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!