我对访问一个字段的一般问题很感兴趣,该字段可能埋藏在包含结构中的任意数量的级别.下面是使用两个级别的具体示例.
假设我有一个结构toplevel,我在MATLAB命令行中定义了以下结构:
midlevel.bottomlevel = 'foo';
toplevel.midlevel = midlevel;
Run Code Online (Sandbox Code Playgroud)
我可以midlevel通过将字段名称作为字符串传递来访问结构,例如:
fieldnameToAccess = 'midlevel';
value = toplevel.(fieldnameToAccess);
Run Code Online (Sandbox Code Playgroud)
但我无法bottomlevel以相同的方式访问结构 - 以下是无效的语法:
fieldnameToAccess = 'midlevel.bottomlevel';
value = toplevel.(fieldnameToAccess); %# throws ??? Reference to non-existent field 'midlevel.bottomlevel'
Run Code Online (Sandbox Code Playgroud)
我可以编写一个fieldnameToAccess查看句点的函数,然后递归迭代以获得所需的字段,但我想知道是否有一些聪明的方法来使用MATLAB内置函数来直接获取字段值.
直到最近,我一直将时间序列数据存储struct在MATLAB中,方法是将索引放在字段名后面,例如:
Structure.fieldA(1) = 23423
Run Code Online (Sandbox Code Playgroud)
因此,struct有一组字段,每个字段都是一个向量.
我已经看到很多其他程序使用不同的格式,其中结构本身被索引,并且结构的每个索引包含一组字段,例如:
Structure(1).fieldA
Run Code Online (Sandbox Code Playgroud)
哪种方法最有效?我应该坚持使用top选项还是应该使用bottom方法切换我的程序?
我有一个结构数组包含字段作为不同长度的结构数组.例如:
's'是一个结构'data'是's'中的一个字段,也是一个结构数组本身和
length(s(n).data) ~= length(s(m).data)
Run Code Online (Sandbox Code Playgroud)
我想预先分配一个数组,该数组从每个字段s.data.timestamp中获取一个时间戳.有没有办法在不使用for循环两次的情况下执行此操作?这是我到目前为止:
% find the total length
count=0;
for x=1:length(s)
count=count+length(s(x).data);
end
% preallocate timestamp array
timestamp=zeros(1,count);
% populate timestamp array
index=1;
for x=1:length(s)
for y=1:length(s(x).data)
timestamp(index)=s(x).data(y).timestamp;
index=index+1;
end
end
Run Code Online (Sandbox Code Playgroud)
我想过根据's'的长度和'数据'的平均长度过高估计我需要的长度,但每个'数据'字段/子结构的实际长度变化很大.我是否会更好地过高估计它的结果并在之后修剪得到的数组?使用我正在使用的数据集时,零时间戳是不可能的,所以这应该不是问题.
首先,我让用户输入他们自己的文本文件,包括状态,大写和填充,我使用以下代码将所有这些值放入结构数组中:
clear
clc
%Part A
textfile=input('What is the name of your text file?\n','s');
fid=fopen(textfile);
file=textscan(fid,'%s %s %f','delimiter',',');
State=file{1}
Capital=file{2}
Population=file{3}
regions=struct('State',State,...
'Capital',Capital,...
'Population',Population)
fclose(fid);
Run Code Online (Sandbox Code Playgroud)
我的第一个问题:是否可以显示结构中的所有值?显示结构数组只是给了我这个:
50x1 struct array with fields:
State
Capital
Population
Run Code Online (Sandbox Code Playgroud)
我的第二个问题是:我是否可以通过尝试查找此结构来访问此结构中的信息'California'?
我有一个MATLAB结构,包含许多字段,它们一起描述了100个对多个变量的观察,如下所示(MATLAB输出):
mystruct =
fieldA: [100x1 double]
fieldB: [100x1 double]
fieldC: [100x1 double]
fieldD: [100x1 char]
fieldE: {100x1 cell}
Run Code Online (Sandbox Code Playgroud)
我想将R用于此数据,因此我将结构保存为.mat文件.并使用R.matlab包导入它.因为我是R的新手,以下可能很笨拙,但我可以很好地访问各个字段(R代码):
> f = readMat('myfile.mat')
> data = f$mystruct
> data
, , 1
[,1]
fieldA Numeric,100
fieldB Numeric,100
fieldC Numeric,100
fieldD Character,100
fieldE List,100
> data = data[, , 1]
> df <- data.frame(fieldA = data$fieldA, fieldB = data$fieldB)
Run Code Online (Sandbox Code Playgroud)
好的,所以这里有一个问题:如何推广上述内容,以便为原始结构中的任意数量的字段生成数据框?对于我的5字段示例,我可以手动执行此操作,但是我的下一个数据集有很多字段,我不想全部输入.
按照这个问题,我试图rbind()和ldply(),其中构建体悍然尺寸的数据帧(1个变量401个OBS和105个变量401个分别OBS).
假设我有一个带键/值对的字符数组:
ch = sprintf('name: John\nsex: M\n')
ch =
'name: John
sex: M
'
Run Code Online (Sandbox Code Playgroud)
这只是一个样本.实际数据在文件中并且有很多对.我可以使用regexp获取令牌,然后使用for循环将它们分配给结构:
lns = regexp(ch, '(\w*):\s(.*?)\n', 'tokens');
for i = 1:numel(lns)
myStruct.(lns{i}{1}) = lns{i}{2};
end
myStruct =
struct with fields:
name: 'John'
sex: 'M'
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法来实现这一点,比如使用regexp(ch, expr, 'names')?
我有一个函数返回一个或多个变量,但随着它的变化(取决于函数是否成功),以下内容不起作用:
[resultA, resultB, resultC, resultD, resultE, resultF] = func(somevars);
Run Code Online (Sandbox Code Playgroud)
这有时会返回错误,varargout {2}未定义,因为resultA当函数失败时,实际上只有第一个变量被赋予一个值.相反,我将所有输出放在一个变量中:
output = func(somevars);
Run Code Online (Sandbox Code Playgroud)
但是,变量被定义为结构的属性,这意味着我必须使用它来访问它们output.A.这本身不是问题,但我需要计算属性的数量,以确定我是否得到了正确的结果.
我想length(output),numel(output)并size(output)没有用,因此,如果任何人有这样的一个聪明的方法我将非常感激.
我有一个文本文件,想将其导入MATLAB并将其列为一个列表:
Person1
name = steven
grade = 11
age= 17
Person2
name = mike
grade = 9
age= 15
Person3
name = taylor
grade = 11
age= 17
Run Code Online (Sandbox Code Playgroud)
上面有几百个条目.每个都用空行分隔.我想我可以扫描文本,使每一个空白行之间的信息添加到列表中的项目.我也希望能够通过名称到每个人抬头一旦我有类似下面的列表.
我想要的东西:
x = [Person1 Person2 Person3
name = steven name = mike name = taylor
grade = 11 grade = 9 grade = 11
age = 17 age = 15 age = 17]
Run Code Online (Sandbox Code Playgroud)
这似乎很直接,但到目前为止我一直遇到麻烦.我可能会忽略一些事情.任何人有任何想法或建议?
我经常需要处理结构数组和包含具有相同字段名的标量结构的单元格,我将其称为“解包结构数组”,我想知道 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.
我创建了一个包含几个不同字段的结构.这些字段包含来自许多不同主题/参与者的数据.
在脚本的开头,我提示用户输入"主题编号",如下所示:
prompt='Enter the subject number in the format SUB_n: ';
SUB=input(prompt,'s');
Run Code Online (Sandbox Code Playgroud)
第34个主题的示例SUB_34.
我想命名我的结构,使它包含这个字符串......即我想要我的结构名称SUB_34,例如SUB_34.field1.但我不知道该怎么做.
我知道你可以为特定的字段名称分配字符串,例如,S如果我想要field1被调用,z则可以为结构分配字符串
S=struct;
field1='z';
S.(field1);
Run Code Online (Sandbox Code Playgroud)
但它不适用于结构名称.
有人可以帮忙吗?
谢谢