MATLAB逻辑索引错误?

4次浏览(最近30天)
丹尼尔黄
丹尼尔黄 2020年5月14日
评论道: 丹尼尔黄2020年5月14日
使用ANSYS APDL,我将数据编译为X_DISP.xLSX并使用ReadMatrix命令导入MATLAB。数据分别分别分别分成第一,第二和第三列的“E”,“节点”和“位移”。我只为每个模拟而改变“e”,因此始终存在相同数量的具有不同位移值的节点。拆分数据的代码如下:
文件名=“x_disp.xlsx”
data = readmatrix(文件名);
e = 2:0.1:2;%测试的位置范围
data_split{长度(e)} = 0;
2 = 1:长度(e)
dist = e (ii);
POS =数据(:,1)== e(ii);
流(“解决e = %。1f, successful pos: %i.\n'e (ii)、sum (pos))
data_split{2} =数据(pos:);
结束
运行此结果会产生一些“e”值被跳过,并且data_split具有具有0x3空单元格数组的单元格。由于错误是一致的,因此我需要在这样的所有数据中手动输入:
data_split{8} =数据(数据(:1)= = -1.3:);
data_split{12} =数据(数据(:1)= = -0.9:);
data_split{13} =数据(数据(:1)= = -0.8:);
data_split {15} =数据(数据(:,1)== - 0.6,:);
data_split {17} =数据(数据(:,1)== - 0.4,:);
data_split{18} =数据(数据(:1)= = -0.3:);
data_split{19} =数据(数据(:1)= = -0.2:);
data_split {20} =数据(数据(:,1)== - 0.1,:);
data_split{21} =数据(数据(:1)= = 6.38378239200000 e-16:);
data_split{22} =数据(数据(:1)= = 0.1:);
data_split{23} =数据(数据(:1)= = 0.2:);
data_split{24} =数据(数据(:1)= = 0.3:);
data_split {25} =数据(数据(:,1)== 0.4,:);
data_split{27} =数据(数据(:1)= = 0.6:);
data_split {29} =数据(数据(:,1)== 0.8,:);
data_split {30} =数据(数据(:,1)== 0.9,:);
data_split {34} =数据(数据(:,1)== 1.3,:);
问题就在这里:我不能用变量索引矩阵,无论我如何格式化它。我不知道我的错误是什么,但我怀疑它是一个潜在的错误。
2 = 1.3;
数据(数据(:1)= =二世:);%不能工作,产生0x3空数组
数据(数据(:,1)== 1.3,:)%的工作原理。不知道为什么,也不知道有什么区别,但确实有效。
附件是我在这个例子中使用的excel表格。提前感谢您的任何建议或意见。

接受答案

斯蒂芬Cobeldick.
斯蒂芬Cobeldick. 2020年5月14日
编辑:斯蒂芬Cobeldick. 2020年5月14日
“我怀疑这是一个潜在的虫子”
不。原因是您正在测试二进制浮点数的确切平等。这不起作用。
当处理二进制浮点数时,你必须总是假设它们有浮点错误,例如,与其测试精确的相等性,你应该总是比较绝对差异和某些公差:
abs (a - b) <托尔
选择要适合您的数据幅度的公差值(例如,您的数据也许是1E-5)。
或者你应该考虑使用 ismembertol ,哪个半自动处理此比较。
如果你使用计算机进行任何类型的数字处理,那么你需要学习二进制浮点数,否则你会认为在你使用的每个应用程序和语言中都有错误:
这也值得一读:
2的评论
丹尼尔黄
丹尼尔黄 2020年5月14日
但有一件事很有趣,那就是为什么当我手动输入里面的整数时,它会毫无容忍度地工作。这表明可以使用round()来调整舍入误差,但事实并非如此。

登录评论。

更多的答案(0)

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!