Finishing a calculation
1 次查看(过去 30 天)
显示 更早的评论
Hey all, I've been analyzing lots of data recently, and thanks to everyone here, I've made great progress in learning Matlab and getting it to work. I have a new issue, but it should be resolved easily.
I've been running a loop to solve for a large amount of data imported from a csv file. I've been having success up until now. Here's the code:
data = csvread('data_d1_multi.csv');
assert (mod(size(data, 1), 1) == 0, ...
'Input data must have an integer multiple of 1 rows');
assert (size(data, 2) == 6, ...
'Input data must have exactly six columns.');
syms d1;
nsys = size(data, 1);
for k = 1 : nsys,
F = solve_d1_multi_eq(data((k-1) + (1:1), 1:end));
d(k, :) = solve(F);
end
fid=fopen('d1_multi_values.csv','w');
fprintf(fid,'%5.5f\n',d);
fclose(fid);
The function file in the above code brings in the data from the csv file and creates the function F, which is then solved, and then the loop reoccurs. It also defines d1 as a symbol. When I get to the fprintf step, however, Matlab won't write. Here is the error:
??? Error using ==> fprintf
Function is not defined for 'sym' inputs.
When I enter d into the command window, I get a list of "values," and these values are mathematical forms that, when I put them individually into the command window, solve into actual numbers. They look like so:
-(1255*log((117428176152016452228945106049267^(1/2)*(14665804317275172766575378895460*i - 2528628208763574832888728359811)^(1/2))/89293179851920557132557466203166 + 30173428047464645764307857899481/44646589925960278566278733101583 - (50832467171298678039874147590785*i)/89293179851920557132557466203166)*i)/(32*pi)
So, my questions:
1) How do I help Matlab output the values?
2) Why doesn't Matlab finish these calculations?
Thanks!
0 个评论
采纳的回答
Walter Roberson
2012-2-23
As far as MATLAB is concerned, it has finished the calculations. It has given you exact analytic solutions, rather than mere 16 digit floating point approximations.
I notice that your outputs are complex valued. You need to take extra steps to output complex values properly.
dd = double(d);
fprintf(fid,'%+5.5f %+5.5fi\n', [real(dd(:)), imag(dd(:))].' );
Here the "i" after the "%+5.5f" is just a literal character to indicate the imaginary component.
In the example above it appears that the imaginary component vanishes in practice, which is not at all obvious from casual examination. If that is the situation for all values, then you could use
fprintf(fid,'%+5.5f\n', real(dd(:)) );
but unless you can prove that the imaginaries will vanish, outputting them would be safer.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Workspace Variables and MAT-Files 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!