Filter löschen
Filter löschen

convert cell of cells to individual variables

6 Ansichten (letzte 30 Tage)
Anthony Sirico
Anthony Sirico am 9 Sep. 2023
Bearbeitet: Stephen23 am 9 Sep. 2023
If you take a look at the objectives photo, i have a cell that contains 32612x1 cells, each will either contain a 200x5 double, or [ ]. The objective1 photo shows what a cell with 200x5 looks like. What I want to do is is take Objective(1), a 200x5 cell, and then column 1 of that cell, and make it J1. Column 2 will be J2, etc. I want to do that for each 32612 cells. If the cell is empty, not to skip, to put a place holder there.
Ultimately what i am trying to do, is bring it over to python so i can upload J1, J2, etc, into spandas dataframes, where J1 will be one dataframe of 32612x200. I tried using jsonencode but its still not formatted correctly.
  1 Kommentar
Stephen23
Stephen23 am 9 Sep. 2023
Bearbeitet: Stephen23 am 9 Sep. 2023
"....and then column 1 of that cell, and make it J1. Column 2 will be J2, etc."
"Ultimately what i am trying to do, is bring it over to python so i can upload J1, J2, etc, into spandas dataframes, where J1 will be one dataframe of 32612x200."
"I tried using jsonencode but its still not formatted correctly."
Given that the string returned by JSONENCODE does not use the input variable name, your request serves no purpose other than to make your code pointlessly complex and inefficient: you could simply use indexing and get exactly the same result.
Whether JSONENCODE give you the expected output is another question entirely.
Perhaps this does what you want:
Note that you can also call Python directly from MATLAB, so probably you could just save the dataframe using... Pandas. It really is very easy (and much much better than writing slow, inefficient, complex code using dynamic variable names):

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Bruno Luong
Bruno Luong am 9 Sep. 2023
Bearbeitet: Bruno Luong am 9 Sep. 2023
assuming c is your (32612 x 1) cell
% Dummy data to test
c=cell(32612,1);
for i=1:size(c,1)
c{i} = rand(200,5);
end
[c{randi(end,1,1000)}] = deal([]);
[T1, T2, T3, T4, T5] = convT(c);
function [T1, T2, T3, T4, T5] = convT(c)
[c(cellfun(@isempty,c))] = deal({nan(200,5)}); % empty "holder"
A = permute(cat(3, c{:}),[3 1 2]); % 32611 x 200 x 5
s = num2cell(A,[1 2]);
s = s(:);
assert(size(s,1)==5, 'data insode c must have 5 columns')
T1 = s{1};
T2 = s{2};
T3 = s{3};
T4 = s{4};
T5 = s{5};
% for k=1:size(s,3) % 5 here
% eval([sprintf('T%d',k) ' = s{k};']); % creat T1, ... T5
% %T.(sprintf('T%d',k)) = s{k};
% end
end
  1 Kommentar
Stephen23
Stephen23 am 9 Sep. 2023
Bearbeitet: Stephen23 am 9 Sep. 2023
With only five hard-coded output arugments that EVAL is completely superfluous.
Five basic variable assignments would be simpler and more efficient. Or using VARARGOUT:
function varargout = convT(c)
[c(cellfun(@isempty,c))] = deal({nan(200,5)}); % empty "holder"
A = permute(cat(3, c{:}),[3,1,2]); % 32611 x 200 x 5
varargout = num2cell(A,[1,2]);
end

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Call Python from MATLAB finden Sie in Help Center und File Exchange

Produkte


Version

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by