我经常需要处理结构数组和包含具有相同字段名的标量结构的单元格,我将其称为“解包结构数组”,我想知道 Matlab 和/或 GNU Octave 中是否还没有函数可以帮助在这两种表示形式之间进行转换。
结构体数组:
foo(1).a = 3;
foo(1).b = pi;
foo(2).a = 5;
foo(2).b = 2.718;
Run Code Online (Sandbox Code Playgroud)
显然num2cell在 GNU Octave 中以一种方式工作(尽管文档中没有提到):
ret = num2cell (foo)
ret =
{
[1,1] =
scalar structure containing the fields:
a = 3
b = 3.1416
[1,2] =
scalar structure containing the fields:
a = 5
b = 2.7180
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找相反的部分,转换ret回foo.
这是一个普遍问题,与特定操作无关.我希望能够将任意函数的结果写入单元格数组的元素,而不考虑函数返回的数据类型.考虑这个伪代码:
zout = cell(n,m);
myfunc = str2func('inputname'); %assume myfunc puts out m values to match zout dimensions
zout(1,:) = myfunc(x,y);
Run Code Online (Sandbox Code Playgroud)
这将适用于"inputname"=="strcat",例如,给定它x并且y是具有适当维度的字符串或单元格.但是如果"inputname"=="strcmp"则输出是逻辑数组,并且Matlab会抛出错误.我需要这样做
zout(1,:) = num2cell(strcmp(x,y));
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有没有办法填充单元格数zout而不必测试生成的变量类型myfunc(x,y ?我应该首先使用a struct(如果是这样,最好的方法是填充它)?
(我通常是R用户,我可以在list没有任何痛苦的情况下使用变量)
编辑:为了简化整体范围,添加以下"要求":我们现在假设,对于返回多个输出的函数,只需要捕获第一个zout.但是当此输出是N值的向量或单元的向量(即Nx1单元阵列)时,这些N值将被映射到zout(1,1:N).
我想比较两个单元阵列,1x160(a)和80x1(b).我的单元格数组由内部有许多字符串的单元格组成.我想比较每个字符串,看看它们是否相等,然后如果它们相等,则插入新数组,否则插入0.我找不到任何功能.我试过'isequal','strfind'和其他人.所有这些都给我下一条错误消息:
如果任何输入参数是单元格数组,则第一个必须是字符串的单元格数组,第二个必须是字符数组.
这是我的代码!
function [inter]=Intersect2(a,b)
int=cell(0);
b2=[b;b];
for i=1:length(a)
if a{i,1}==b2{i,1}(1) ( or 'isequal','strfind')
int{i}=a{i};
else
int{i}=0;
end
end
Run Code Online (Sandbox Code Playgroud) 我正在尝试将元素添加到2D单元阵列行的末尾。我的代码是:
b = cell(5, 0)
b(1) = {b(1, :), 2} % Trying to append at the end of the first row
Run Code Online (Sandbox Code Playgroud)
这给了我错误: error: A(I) = X: X must have the same size as I
我还尝试了其他各种形式,例如:
b = cell(5, 0)
b(1, end+1) = 2 % Ok, inserts 2 at [1,1]
b(2, end+1) = 3 % No, inserts 3 at [2,2] instead of [2, 1]
Run Code Online (Sandbox Code Playgroud) 我有一个大矩阵M(nxm).我将把存储在vector中的索引指定的一些元素作为单元格元素进行求和.有许多索引组,因此单元格有多个元素.例如
M = rand(2103, 2030);
index{1} = [1 3 2 4 53 5 23 3];
index{2} = [2 3 1 3 23 10234 2032];
% ...
index{2032} = ...;
Run Code Online (Sandbox Code Playgroud)
我将总结索引{1}处的所有元素,总结索引{2}处的所有元素...,现在我正在使用循环
sums = zeros(1, 2032);
for n=1:2032
sums(n) = sum(M(index{n}));
end
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何方法可以使用单行命令而不是循环来执行此操作.使用循环非常慢.
我想在MATLAB中计算Cell数组中的行数.我使用下面的代码来计算单元格数组中的列数,但我不知道它计算行的方式.
filledCells = ~cellfun(@isempty,a);
columns = sum(filledCells,2)
Run Code Online (Sandbox Code Playgroud)
举个例子,我有x作为单元格数组:
x = [5] [1x8 double] [5]
Run Code Online (Sandbox Code Playgroud)
该单元阵列有一行三列.我需要一个代码来计算等于"1"的行数,但我没有找到计算它的方法.
你好我有一个char的单元格数组(由下划线分隔),我想转换为double.我是在for循环中完成的,但由于尺寸很大,需要花费很多时间.我想用cellfun,但我不知道如何通过分隔符.
你能帮助我吗?
listofwords = {'02_04_04_52';'02_24_34_02'};
for i = 1 : size(listofwords,1)
listofwords_double(i,:) = str2double(strsplit(listofwords{i},'_'))./1000;
end
listofwords_double2= cellfun(@strsplit , listofwords);
Run Code Online (Sandbox Code Playgroud)
基准
按照Divakar的要求
>> benchmark1
Speedup with EVAL over NO-LOOP-SSCANF = -46.3398%
>> benchmark1
Speedup with EVAL over NO-LOOP-SSCANF = -46.4068%
>> benchmark1
Speedup with EVAL over NO-LOOP-SSCANF = -47.1129%
>> benchmark1
Speedup with EVAL over NO-LOOP-SSCANF = -46.2882%
>> benchmark1
Speedup with EVAL over NO-LOOP-SSCANF = -46.2325%
>> benchmark1
Speedup with EVAL over NO-LOOP-SSCANF = -46.0161%
>> …Run Code Online (Sandbox Code Playgroud) 使用Matlab,假设我们有一个单元阵列的单元阵列.例如:
C = { {'hello' 'there' 'friend'}, {'do' 'say' 'hello'}, {'or' 'maybe' 'not'} }
Run Code Online (Sandbox Code Playgroud)
我想找到C中包含字符串的所有单元格数组的索引'hello'.在这种情况下,我期望1和2,因为第一个单元阵列'hello'在第一个槽中,第二个单元阵列在第三个槽中.
我想象使用矩阵(一个简单的查找)会更容易一些,但出于教育目的,我也想学习使用单元格数组的过程.
提前谢谢了.
可以将Matlab结构数组转换为单元数组而无需遍历数组吗?
我希望struct数组中的每个结构都成为单元数组中的一个单元格.命令struct2cell似乎没有这样做,因为它将结构中的每个字段分成一个单独的单元格.
这已发布到:
I have an array of cells in which I want to select 3 lines so I used this temp = testresults(13:15,1:end).
The array being bigger, I get a lot of empty cells
{'Summary Test Re…'} {'Overall' } {0×0 char } {'OVP Transition …'} {0×0 char} {0×0 char} {0×0 char} {0×0 char} {0×0 char} {0×0 char}
{'Pass/Fail' } {'Passed' } {'No Transition t…'} {'Passed' } {0×0 char} {0×0 char} {0×0 char} {0×0 char} {0×0 char} {0×0 char}
{'Failed cases' } …Run Code Online (Sandbox Code Playgroud) cell-array ×10
matlab ×10
octave ×2
arrays ×1
delimiter ×1
function ×1
performance ×1
return-value ×1
rows ×1
types ×1