字符串变量名

17日视图(30天)
米洛斯岛Krsmanovic
米洛斯岛Krsmanovic 2021年8月23日
我有一个表,当空列和数以千计的行包含字符串和数值(附加小样本)。我需要情节数百种不同的数据通过匹配特定条件和提取每个情节,只有部分的数据基于这个标准。我想通过两个变量(匹配 .Properties.VariableNames )函数将做一些基于这两个输入参数。
我开始阅读将字符串转换为变量名和发现弃用功能 genvarname () ,点 matlab.lang.makeValidName () 这需要字符串作为参数。但后者给了我错误:
未被认可的表变量名称“X”。
我想使用它的方法是通过阅读我的数据:
结果= readtable (“raw_data.csv”,“PreserveVariableNames”,真正的);
然后指定变量名我想处理:
X = matlab.lang.makeValidName (“σ”);
Y = matlab.lang.makeValidName (“LR”);
然而,试图通过 X Y 作为函数的参数,然后引用如下:
results.X
扔我的错误。
如果我手动编辑这个调用 results.Sigma results.LR ,一切都很好。但改变这两个变量的函数会打败它的目的。我喜欢保持 X Y 广义函数中的变量名,只有改变上面的两行之前调用的函数。
我也在动态生成的变量名和阅读 为什么eval是一个很大的禁忌 。我提到的替代方法,细胞/ ND-arrays或结构等但找不到工作。
谁能告诉我什么最合适的方法来解决这个问题,好吗?
8的评论
米洛斯岛Krsmanovic
米洛斯岛Krsmanovic 2021年8月30日
我已经expained为什么在细节,在我之前的评论。
当然我会写函数简单地直接接受这两个列,这也是我问什么——如果我知道怎么做。这就是为什么我问的问题放在第一位。
为了其他的人将来可能会阅读这个话题,这是我最后最后。
之前的功能:
results.X= results.LR;
结果。Y= results.L;
这里我将改变LR和L的任何其他28个列名为每个实例/头当我调用这个函数。
里面的功能:
i = 1: e
数据(我)= num2cell(平均(results.Xresults.Material = =字符串(critMaterial (1) & results.Sigma = =字符串(critSigma (1)))));
数据(我)= num2cell(平均(results.Y (results.Material = =字符串(critMaterial (2) & results.Sigma = =字符串(critMaterial (1)))));
结束

登录置评。

接受的答案

Wan霁
Wan霁 2021年8月23日
编辑:Wan霁 2021年8月23日
嗨,尝试以下代码
结果{:,“X”{}=结果:,“σ”};
结果(:,“σ”)= [];
结果{:,“Y”{}=结果:,“LR”};
结果(:,“LR”)= [];
3评论
米洛斯岛Krsmanovic
米洛斯岛Krsmanovic 2021年8月29日
我终于接受这个答案,因为它让我最近工作的解决方案。我介绍了唯一的区别是不覆盖现有的列,但创建额外的两列,我将覆盖在每个实例调用函数。
再次感谢。

登录置评。

更多的答案(3)

每•艾萨克森
每•艾萨克森 2021年8月23日
编辑:每•艾萨克森 2021年8月23日
第一次做点运动
% %
结果= readtable (“raw_data.csv”);
结果(4:)
ans =1×4表
材料 σ l LR ________ ________ _____ ___‘宠物’{}{' + '}522年0.149
% %
results.Properties.VariableNames {“σ”}=“X”;
results.Properties.VariableNames {“LR”}=“Y”;
结果(4:)
ans =1×4表
材料 X l Y ________ ________ _____ ___‘宠物’{}{' + '}522年0.149
这样您可以重命名表中的变量(见也 @Wan霁 评论),但AFAIK您不能创建别名,我认为这是你在要求什么。
国际海事组织,重命名变量最终会导致混乱。一种更好的方式来实现 “我喜欢把X和Y是广义函数中的变量名” 是定义函数
函数foo (X, Y)
X和Y %做东西
结束
和叫他们
foo(结果。σ,results.LR)
2的评论
每•艾萨克森
每•艾萨克森 2021年8月27日
“我不想重命名列/属性名的主要表” 是的,这就是为什么我写道: “[…但AFAIK您不能创建别名,我认为这是你要求什么。”

登录置评。


Stephen23
Stephen23 2021年8月27日
编辑:Stephen23 2021年8月27日
混合无关的话题让你认为这是比这复杂得多。
看您自己的代码,你写在你的问题:
results.Sigma
results.LR
然后你在那之后写道: “如果我手动编辑这个调用 results.Sigma results.LR ,一切都很好。但改变这两个变量的函数会打败它的目的。"
所以…那就不要 “改变” 他们内部的函数。简单地使用字符串来选择你想要的变量(你指定 在这里 您想要手动选择对得到的数据绘制/分析),正如MATLAB文档解释道:
x = [“σ”,“Xpair2”,“Xpair3”,. .“XpairN”];
y = [“LR”,“Ypair2”,“Ypair3”,. .“YpairN”];
k = 1:元素个数(x)
Xdata =结果。(Xs (k));
Ydata =结果。(Ys (k));
无论处理Xdata Ydata
结束
所以你可以很容易地 “手动” 选择和处理任何对你想要的数据。
我看到绝对没有理由数百次你需要复制和粘贴代码。

图像分析
图像分析 2021年8月23日
不仅仅是使用“eval()是一个大禁忌”就像你说的,那就是写一个程序,你的整个概念不知道提前变量名和创建命名变量基于字符串或其他运行时的输入是一个坏主意。
这是糟糕的时期。不是eval()问题所以你只需要找到一些其他方法或“替代法”做坏事。它不是一个好主意。我总是认为这是显而易见的,不需要太多的解释,但也许其他人有不同的想法或不明白的解释。
看到另一个的常见问题的讨论。
1评论
米洛斯岛Krsmanovic
米洛斯岛Krsmanovic 2021年8月26日
公平点,穷人选择的单词从我结束。我指的是动态分配的变量名我使它听起来好像我说的是eval()函数本身。我添加了下面的一个小例子来更好地解释我想做什么。

登录置评。

s manbetx 845


释放

R2019b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!