I am trying to make a loop that will let the user create multiple matrices in which they have declared the size of the matrix as in the number of columns and rows. I have created the first part of this loop, but my issue is creating a variable whose name will change so that the matrix that was previously created in the loop will not be overwritten. I then have to multiply all the differnt matrices together.
DO n=1:number !number is the number of matrices that need to be created
WRITE(,)'Enter number of rows the matrix has'
READ(,)r
WRITE(,)'Enter number of columns'
READ(,)
REAL, DIMENSION(r,c) :: "here I need a changing variable name so it isn't overwritten every time."
I wouldn't dynamically generate new variables. It seems more like you just want to make each new variable an element of an array. Allocate an array with size equal to the number of loop iterations. It might get tricky if the variables are all 2d arrays of different dimensions, but you could certainly wrap it in some kind of structure.
Related
I have a structure called "variable" with the following contents.
There are some negative values inside every field of vectors. I would like to keep the value but make it positive.
Make a new variable say v11 (a 1633X1 double), having an element wise average of the fields.
Use abs with structfun to convert values to positive. Then use struct2cell and horizontally concatenate the cell contents to apply mean and assign the result to the new field v11.
variable = structfun(#abs,variable,'un',0);
v11= struct2cell(variable);
variable.v11=mean([v11{:}],2);
I have a vector with +16M data, and I've got to transform it in 101 matrices of 401x401 elements each. I know how to create such matrices independently (writing a loop for each one of them) but I think there must be some way to create all of them in using two or more loops. The problem is, I don't know exactly how to do this.
This is what I've tried so far:
data=load('file.dat');%This file contains 3 columns of data, I only need the first one
var=data(:,1);
p=401;%Size of the matrices
for n=0:400
mat1(n+1,:)=var(p*n+1:p*(n+1),:);
end
This code would create the first 401x401 matrix. By changing the indices, I could (individually) create the rest, but I would prefer to add another loop (or loops) to create them automatically instead of repeating this code a hundred times.
The function mat = vec2mat(vec,matcol) converts the vector vec into a matrix with matcol columns, creating one row at a time. If the length of vec is not a multiple of matcol, then extra zeros are placed in the last row of mat. The matrix mat has ceil(length(vec)/matcol) rows.
See also the manual entry.
I have 40 variables. The 40 variables names are in a cell array (40 x 1).
Each variable will have a matrix. The matrix is of type of double and will be size 5000 x 150. It will also have a vector of size 1 x 150 & one last vector 1 x 4.
Initially I was going to dynamically name each struct with its variable name in the cell array. So would look like something like below (assuming variable name is ABC),
ABC.dataMatrix
ABC.dataVec
ABC.summaryData
All the variables would be saved to a directory.
However I've read using eval isn't a very good idea so guessing my idea isn't the best way to go about this problem. What would be the best way to go about this problem?
You can either use struct arrays with dynamic field names, as #Shai and #RobertStettler suggest.
However, another option is a table. This might be more appealing if you want to see your data in one big matrix, and you can give each table row the name of your variables too! Note that the rows in a table would then be what you call your variables, but MATLAB calls the table columns its variables.
Also note that using a table can be more difficult than using struct or cell arrays, but if you know how to use them, you can handle a table too.
An example:
% create dummy data
rowNames = {'a';'b';'c'};
M = {ones(3); zeros(3); nan(3)}; % a cell, one element per item in rowNames
V = [1 2; 3 4; 5 6]; % a matrix of vectors, each row containing a vector for every item in rowNames
% create a table
T = table(M,V,'RowNames',rowNames); % this is where your variable names could go
Now, to access data you could use (some examples):
T(2,:) or T('b',:), return a table for all data on the 'b' row.
T(:,2) or T(:,'V'), return a table of variable V for all rows.
T.V or T{:,2} or T{:,'V'} or T.(2), return matrix V for all rows. This syntax is similar to accessing a (dynamic) field name of a struct.
T{3,1} or T{'c',1} or T.M('c'), return cell M for row 'c'. This syntax is similar to accessing a cell, but with more advanced possibilities, i.e. the ability to access the table via row or variable names.
T{3,1}{:} or T{'c',1}{:} or T.M{'c'}, return cell contents M for row 'c'.
And even more complex: T('a',:).M{:} is a complex way of accessing the cell content of M for row 'a', which can be done with T{1,1}{:} or T.M{'a'} or T{'a','M'}{:} or T.M{1} as well.
In your case you would en up with a 40x3 table, with every row what you call a variable and the first column the matrices (in cell arrays), and the last two columns the vectors (as well in cell arrays or as a 40xm double, m being the length of your vector).
I'm trying to create a dataset from a double matrix and cell array of labels.
I don't have access to the mat2dataset function so I'm trying to write something similar.
>> whos data feature_labels
Name Size Bytes Class Attributes
data 2x208 3328 double
feature_labels 1x208 50776 cell
In actual use the data will have ~2million rows and always be double format. The number of columns will range from 20 up to 2000, so doing something like;
>> D = dataset([],[],[],[],[],...[], 'VarNames', feature_labels);
isn't really feasible.
Any suggestions?
edit:
Currently using a for loop and horzcat to concatenate new dataset columns on each loop. I don't see a way to pre-allocate the dataset size is this way so I imagine performance will chug with the larger datasets though..
Have you considered using a struct? I use these all the time in MATLAB for database things. I know it works absolutely fantastic for up to 20,000 elements with about 15 fields each, so I think it would still work just as well as anything else for 2 million items with 2 fields.
Alternatively, can't you just put it in a cell array?
DataBase{rowNum,1}=dataVector(rowNum,:);
DataBase{rowNum,2}=label{rowNum};
To preallocate a struct or cell, its relatively easy, with a struct, once you make your first one to initialize the fields, just say Struct(2000000).fieldName =[]
TO preallocate your cell array, just do
DataBase={[]}
DataBase{2000000,2}=[]
This preallocates all of it and fills it with empty values.
I have created a vector containing zeros and 1's using the following command in a for loop.
G(:,i)=rand(K,1)<rand;
Since this is part of a larger problem at a particular stage I need to count the number of 1's that are present in each column.
I have tried to find the count using a for loop which is very messy and takes too long.
I found that histc can be used for this but I get an error
histc(G(:,1),1)
First input must be non-sparse numeric array.
Is there a better way to do this or am I missing something here ?
If you have a matrix G containing zeroes and ones, and you want to know how many ones are in each column, all you need is SUM:
nZeroes = sum(G);
This will give you a vector containing a total for each column in G.