I have a matrix with 4 variables.
I want to plot the results as a 3D surface animation, having 3 of the variables as x,y and z and the 4th variable as time (t).
I imagine the code to be something like:
figure(1)
plot4d(Results(:,1), Results(:,2), Results(:,6), Results(:,3))
Here is some sample data:
X Y t Z
-0.1111 1.2670 1.1000 0.0000 0.0000 9.4568
-0.1111 1.2670 1.2000 0.0000 0.0000 15.9115
-0.1111 1.2670 1.3000 0.0000 0.0000 18.3639
-0.1111 1.2670 1.4000 0.0000 0.0000 22.3732
-0.1111 1.2670 1.5000 0.0000 0.0000 23.3274
-0.1111 1.2670 1.6000 0.0000 0.0000 23.3389
-0.1111 1.2670 1.7000 0.0000 0.0000 23.3437
-0.1111 1.2670 1.8000 0.0000 0.0000 22.0600
-0.1111 1.2670 1.9000 0.0000 0.0000 23.7531
-0.1111 1.2670 1.0000 0.0000 0.0000 0
-0.1111 1.2670 2.1000 0.0000 0.0000 0
-0.1111 1.2670 2.2000 0.0000 0.0000 0
-0.1111 1.2670 2.3000 0.0000 0.0000 0
-0.1111 1.2670 2.4000 0.0000 0.0000 0
-0.1111 1.2670 2.5000 0.0000 0.0000 0
-0.1111 1.2670 2.0000 0.0000 0.0000 23.1249
-0.1111 1.5330 1.1000 0.0000 0.0000 20.7103
-0.1111 1.5330 1.2000 0.0000 0.0000 40.2953
-0.1111 1.5330 1.3000 0.0000 0.0000 53.0801
-0.1111 1.5330 1.4000 0.0000 0.0000 63.1132
The goal is to produce a 3D surface plot that varies with time, so that it looks like someone is waving a blanket ;)
If what you plot is a line, then you could just display it frame by frame, pausing between them according to the time stamp (assumed to be in seconds):
x = Results(:,1);
y = Results(:,2);
z = Results(:,3);
t = Results(:,4);
dt = [diff(t);eps];
h = axes('Parent', figure());
hold(h, 'off');
for k = 1:numel(t)
plot3(h, x(1:k), y(1:k), z(1:k), '-*k');
pause(dt(k));
end;
If you want to capture the animation for the movie, check the MATLAB tutorial page.
I'm trying to get two matrices to divide, properly, element by element.
Essentially, firstd is a 6x499 and secd is 6x498. I first eliminate firstd's extra elements by doing firstd(:,499)=[]; making it 6x498. Now the next step is to transform firstd into the nominator, nom=((firstd.^2)+1).^1.5; My denominator is just denom=secd;
Both nom and denom have come out as 6x498 matrices with real, non-zero data for each element. However, when doing Rlayer=nom./denom, Rlayer comes out as this ludicrous 6x498 zero-ridden matrix.
I also trimmed out the elements in denom that were =0 by changing them to 0.0001.
Segment of result for Rlayer (Columns 493 through 498)
-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000
-0.0000 0.0000 -0.0000 0.0000 0.0000 -0.0000
-0.0000 0.0000 -0.0000 0.0000 0.0000 -0.0000
-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000
-0.0000 0.0000 -0.0000 0.0000 -0.0000 0.0000
-0.0000 0.0000 -0.0000 0.0000 0.0000 -0.0000
Below are two segments of denom (Columns 487 through 492)
0.0250 0.0281 -0.0281 0.0125 -0.0500 0.0969
-0.0125 0.0750 -0.1219 0.1094 -0.0938 0.0937
0.0344 0.0406 -0.1094 0.1187 -0.1344 0.1531
0.0001 0.0250 0.0001 -0.0437 0.0500 0.0062
0.0781 -0.0219 0.0094 -0.0125 -0.0188 0.1062
0.0250 0.0438 -0.0812 0.0937 -0.1063 0.1562
(Columns 493 through 498)
-0.1187 0.1156 -0.0844 0.0688 -0.0406 0.0125
-0.0969 0.1094 -0.0906 0.0469 0.0062 -0.0156
-0.1375 0.1719 -0.1656 0.0781 0.0187 -0.0531
-0.0562 0.1188 -0.1500 0.1438 -0.1187 0.1187
-0.1781 0.2281 -0.2156 0.1750 -0.1250 0.0812
-0.1750 0.1938 -0.1469 0.0563 0.0031 -0.0156
and this is a segment of nom (Columns 493 through 498)
1.0904 1.0235 1.0881 1.0368 1.0769 1.0514
1.0685 1.0201 1.0769 1.0272 1.0497 1.0532
1.0928 1.0180 1.1210 1.0201 1.0568 1.0685
1.0568 1.0285 1.1001 1.0170 1.0952 1.0260
1.0952 1.0078 1.1380 1.0107 1.1026 1.0272
1.0928 1.0078 1.1077 1.0212 1.0463 1.0480
Why is this division leading to this result? I've tried dividing with rdivide, in a double for loop, and row by row in a for loop. All number types are double.
I have data as shown below and have no idea why the point (25,25,0) does not plotted into the graph.
X = [0,71,142,213,284,355,426;0,71,142,213,284,355,426;0,71,142,213,284,355,426;0,71,142,213,284,355,426;0,71,142,213,284,355,426;0,71,142,213,284,355,426];
Y = [0,0,0,0,0,0,0;71,71,71,71,71,71,71;142,142,142,142,142,142,142;213,213,213,213,213,213,213;284,284,284,284,284,284,284;355,355,355,355,355,355,355];
IntensityError =
1.0e-04 *
0.4609 0.0000 0.0000 0.0000 0.0000 0.0000 0.4609
0.9217 0.0000 0.0000 0.0000 0.0000 0.0000 0.9217
0 0.0000 0.0000 0.0000 0.0000 0.0000 0
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
mesh(X,Y,Error)
hold on plot3(25,25,0,'*')
When you run the above code, you will see that the point (25,25,0) is not plotted.
I have tried to solve this problem for many days. Please help me.
Not sure what you mean, but the point shows on the figure in my quick test:
X = [0,71,142,213,284,355,426;
0,71,142,213,284,355,426;
0,71,142,213,284,355,426;
0,71,142,213,284,355,426;
0,71,142,213,284,355,426;
0,71,142,213,284,355,426];
Y = [0,0,0,0,0,0,0;
71,71,71,71,71,71,71;
142,142,142,142,142,142,142;
213,213,213,213,213,213,213;
284,284,284,284,284,284,284;
355,355,355,355,355,355,355];
IntensityError = 1.0e-04 *[
0.4609 0.0000 0.0000 0.0000 0.0000 0.0000 0.4609;
0.9217 0.0000 0.0000 0.0000 0.0000 0.0000 0.9217;
0 0.0000 0.0000 0.0000 0.0000 0.0000 0;
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000;
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000;
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000];
figure;
mesh(X,Y,IntensityError), hold on;
plot3(25,25,0,'*');
For this question, I'm supposed to create a NxN powers table in matlab using arrays.
The code I have so far is as follows:
C = [];
D = [];
N = input('Enter the value you would like to use for your NxN Powers Table: ');
for i = 1:N
for j = 1:N
C = [C;i^j];
end
C = transpose(C);
D = [D;C];
C = [];
end
D
This code works perfectly fine for any numbers from 1-9, as soon as I enter anything greater than that, it prints out weird values.
Here is the output I have using 5 as an input, and the second one is using 10 as an input.
Enter the value you would like to use for your NxN Powers Table: 5
D =
1 1 1 1 1
2 4 8 16 32
3 9 27 81 243
4 16 64 256 1024
5 25 125 625 3125
Enter the value you would like to use for your NxN Powers Table: 10
D =
1.0e+010 *
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0010
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0010 0.0060
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0006 0.0040 0.0282
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0002 0.0017 0.0134 0.1074
0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0005 0.0043 0.0387 0.3487
0.0000 0.0000 0.0000 0.0000 0.0000 0.0001 0.0010 0.0100 0.1000 1.0000
Any ideas what could be wrong with my code? Seems like a simple fix, I just can't figure out whats wrong with it. Any help is greatly appreciated. Thanks
Notice the 1.0e+010 *. It means that the numbers should be multiplied by 10000000000. Five digits are not enough to print it. Insert format long or format short g to see the whole numbers.
I think your code works fine. Note that 10^10 = 1e10; the very last element in your output D is indeed 1e10. Check individual elements D(i,j) to verify that those are correct. MATLAB can't display all the elements because some elements are so much larger than other ones; 1e10 has 10 digits in it, for instance, while 1^1 = 1 has 1 digit. So spacing would get screwed up if this behavior didn't happen.
I have a text file (c:\input.txt) which has:
2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0 1024.0 2048.0 4096.0 8192.0
In Matlab, I want to read it as:
data = [2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0 1024.0 2048.0 4096.0 8192.0]
I tried this code:
fid=fopen('c:\\input.txt','rb');
data = fread(fid, inf, 'float');
data
but I am getting some garbage values:
data =
1.0e-004 *
0.0000
0.0015
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0239
0.0000
0.0000
0.0000
0.0000
0.0066
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0016
0.0000
0.0000
0.0276
0.0000
0.3819
0.0000
0.0000
Where is the mistake?
fread is for reading binary files only!
The equivalent for text files is fscanf, used as follows:
fid = fopen('c:\\input.txt','rt');
data = fscanf(fid, '%f', inf)';
fclose(fid);
Or in your case, simply use load:
data = load('c:\\input.txt', '-ascii');
There are many other ways in MATLAB to read text data from files:
dlmread
textscan
importdata
Your file is a text file, so you should open it for text read:
fid=fopen('c:\\input.txt','rt');
Then, for reading, I find TEXTSCAN to be more powerful than FREAD/FSCANF (the differences between them all are summarized here
data = textscan(f, '%f')
returns a cell array. You can get at the contents with
>> data{1}
ans =
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
TEXTREAD is easier to use than TEXTSCAN, but according to the documentation is now outdated.