图片缩略图"itemprop=

tdm读者

版本2.6 (46.7 KB) 吉姆Hokanson
读取TDMS文件v1和v2不带DLL
4.9
66年评级

383下载

更新2020年11月11日

查看版本历史

查看许可协议

读取TDMS文件到Matlab。

最简单的用法是:
data = TDMS_getStruct(filename.tdms);

优点:
—支金宝app持读取v2文件
-不需要NI DLL,因此它不需要32位窗口
—支金宝app持数据交叉
-只允许读取名称和属性来快速了解文件中的内容
-允许读取数据的特定子集,以限制内存使用

有关子集检索示例,请参见:
https://gist.github.com/JimHokanson/dfecf21bde0bb7f2484adaf3c646b91a

引用作为

吉姆·霍坎森(2021)。tdm读者(//www.tatmou.com/matlabcentral/fileexchange/30023-tdms-reader), MATLAB中央文件交换。检索

意见及评分(240)

吉姆Hokanson

读取文件返回的结构除了.data字段外还包含一个属性字段(通常是. props ?)属性应该包含您正在寻找的内容。

Debejyo Chakraborty

@吉姆,我已经使用这个文件成功获取数据。但是,创建的结构中缺少一个关键信息。采样率。如何获得与每个通道相关的采样率?当使用VI读取它时,它是一个称为“dt”的波形属性。当使用excel时,它显示为wf_increment。

卢卡斯Zaczek

非常感谢Jim,我使用了编辑TDMS_genvarname2文件的方法,我的.tdms文件正确加载:)

吉姆Hokanson

你好卢卡斯,

祝贺您,您在代码中发现了一个合法的错误!我试图思考为什么会抛出一个错误,然后我意识到我只支持删除非alpha数字,而不是unicode字段名的翻译。金宝app

你可以尝试使用第二种输出结构类型,尽管使用它可能有点尴尬:
TDMS_getStruct (filePath, 2)

要硬编码修复默认输出格式(#4),进入TDMS_genvarname2,简单地写:
varName = genvarname(字符串)
然后删除剩下的函数
注意,genvarname替换为十六进制值和一个更新的函数,makeValidName替换为下划线(您也可以使用它)
Out = genvarname(['a' char(321)]'a']) -> 'a0x0141a'
Out = matlab.lang。makeValidName ([a char (321)'a']) -> 'a_a'

有意义吗?抱歉没有很好地处理unicode:/

最好的
吉姆

卢卡斯Zaczek

嗨,吉姆,
当我试图打开TDMS文件时,我有一个错误:“无效字段名称:g_2017_08_30_12_38_29_Ładowarka_CAT_962M___Wywrotka_Volvo_A30F”。
我想是因为mark 'Ł'。你能帮我解决这个问题吗?

吉姆Hokanson

嗨,苏米特,

如果我没记错的话,你的路径上需要有两个文件夹,主文件夹和子函数文件夹。另外,我建议使用TDMS_getStruct函数。

最好的
吉姆

苏米特纳

嗨,吉姆,
我正在尝试使用代码打开TDMS文件。所有函数和tdms文件都在同一个文件夹中。我得到这个错误。你能告诉我我是否丢失了工具箱或其他东西吗?

data = TDMS_readTDMSFile('X257HB-P018-Performance test_2021_03_09_12_53_33_88.tdms');
未定义函数或变量'TDMS_handleGetDataOption'。

TDMS_readTDMSFile中的错误(第220行)
TDMS_handleGetDataOption(“检查”,paramsStruct)

而且
data = TDMS_getStruct('X257HB-P018-Performance test_2021_03_09_12_53_33_88.tdms');
未定义函数或变量'TDMS_handleGetDataOption'。

TDMS_readTDMSFile中的错误(第220行)
TDMS_handleGetDataOption(“检查”,paramsStruct)

TDMS_getStruct中的错误(第83行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

谢谢
苏米特

吉姆Hokanson

你好,

不幸的是,这个TDMS阅读器没有针对速度进行优化,读取数据可能很慢。我曾考虑过用C重写解析器,但由于我已经近十年没有接触过TDMS数据,所以不太可能很快实现。写入数据的方式会影响底层的文件结构(即使总数据量相同,写入磁盘的频率也会加快读取速度)。每次写入通常都会创建一个小报头,这会增加大量处理开销。如果Labview没有阻塞,你可以对文件进行碎片整理,它会在磁盘上以最有效的布局重新排列数据,而不是反映数据是如何收集的。这通常对读取速度有很大的影响。我还没有尝试过多gb的文件!您还可以将文件结构读入内存,然后对数据进行部分读取(例如,一次读取100万个样本数据并进行一些计算)。我不确定这对你的情况是否有帮助,因为这种方法实际上是为了确保你有足够的内存,而不是加快读取速度。但是,如果您的计算机正在使用您的硬盘驱动器作为内存,则遇到一些交换空间问题,这可能会有所帮助。 I would estimate that you need at least a factor of 2, if not more, to read without swapping (i.e. at least 40GB - plus more for the OS, of memory). Note, I wrote the subset reading pretty hastily and the documentation for it is quite poor. There should be examples somewhere in the files (if not in the comments history below ...). Best of luck and feel free to email me if you have any more questions.

吉姆

威廉格雷

嗨,吉姆,

谢谢,这是我在工作中经常使用的非常有用的代码。请问,可以读取的文件大小有限制吗?我注意到,如果文件大小在1gb以下,该函数工作非常快,但对于20gb+的大型数据集,数据似乎不加载?

任何帮助或建议都非常感谢!

谢谢,

吉姆Hokanson

你好卢卡斯,

在哪里加载文件并不重要。我唯一能想到的是,索引和数据文件之间存在差异,由于某种原因,在其中一个实例中使用了一个,在另一个实例中使用了另一个。您可以尝试隐藏索引文件(将其移动到另一个文件夹),并查看仅使用数据文件是否会显示两个位置之间的行为差异。您还可以将索引文件路径直接传递到TDMS_readTDMSFile中,它将只解析索引文件。你总是可以给我一个数据文件和相应的索引文件,我可以调查。对于导入错误,您总是可以将TDMS_processLeadIn包装在try catch语句中(在TDMS_preprocessFile中),并在catch中放入eof_error=true。这意味着文件只解析到第一个错误。我认为这就是Excel文件的功能……

试一试
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

Eof_error = true;
结束

最好的
吉姆

卢卡斯Rothmann

你好吉姆,
我试图使用你的代码来读取我用LabView VI创建的一些TDMS文件。出于某种原因,在我的情况下,你的代码难以读取数据,其中. TDMS文件不在与我的Matlab脚本相同的路径中,我能够直接调用file_data = TDMS_getStruct(file_name.tdms)文件而没有问题。每当我试图生成一个路径到脚本目录之外的文件,并将其传递给TDMS_getStruct(路径),我得到以下错误。我确实尝试调试错误,发现当程序遇到问题时,文件的读取似乎几乎是在结束(iSeg接近TDMS_readFileHelper_v1内部的n_segs)和Ttag, Dtag, Stag和mtag是空的,这就是为什么if条件无法解决。

错误信息:

||和&&操作符的操作数必须转换为逻辑标量值。

TDMS_readFileHelper_v1中的错误(第204行)
if ~(Ttag == 84 && Dtag == 68 && Stag == 83 && mtag == 109)

TDMS_readTDMSFile错误(第256行)
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

TDMS_getStruct中的错误(第83行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

read_laser_data错误(第70行)
file_struct = TDMS_getStruct(TDMS_name);

我也尝试使用addpath(file_location)和cd(file_location)函数来解决这个问题,但没有成功。

任何帮助都非常感激。很多谢谢!

卢卡斯

Erik Jakobsson

刘易斯选

你好,

我很抱歉,在阅读你的回复后,我检查了我是否仍然可以访问数据,我可以。因此你是正确的,这只是变量编辑器的一个限制。再次感谢你的帮助,非常感激。

刘易斯

吉姆Hokanson

@Lewis有趣的是,我没有太多使用字符串,我不知道为什么它在这一点上失败的字符串,尽管它不会让我感到惊讶,如果代码在其他地方失败的字符串。谢谢你的提醒。关于数据大小,我读了文件中说的....也许你用来写的东西有一些隐藏的预分配?无论如何,我不认为这是我的代码的问题(尽管我可能是错的)。我想你说的打开是指用变量编辑器打开吧?这是MATLAB的东西,和我的代码没有关系。

刘易斯选

感谢您的及时回复!
我意识到文件名是一个字符串,当我把它改为字符类型时,它就工作了。它现在似乎已经工作了,尽管当我得到数据时,它显示为1x1600000双(应该只有1048576),当打开说“不能显示超过524288个元素的变量的摘要。”,这是函数的限制吗?

很多谢谢!

吉姆Hokanson

@Lewis我不知道你是怎么得到一个错误在这一点上。知道当时的indexFile是什么会很有帮助。如果你在TDMS_preprocessFile的第102行设置了一个断点,那么indexFile的值是多少?它是什么类类型(即类(indexFile)说什么)?我认为可能相对路径会搞砸代码,但它似乎没有。我能得到这个错误的唯一方法是传入一个无效的名称类型,例如names = {'my_path.tdms','my_path2. tdms'。tdms'} TDMS_getStruct(names(1))(注意,您需要花括号{1},而不是(1))或name = ["test" '。这将创建一个包含2个元素的字符串数组["test" "]。Tdms "],不是单个字符串"测试。tdm”…

刘易斯选

下午好,
我试图读取一个。tdms文件到matlab。我已经将文件夹添加到我的路径中,并使用*datacheck = TDMS_getStruct(LabViewFileName)*来尝试此操作。(文件名设置正确)我得到下面列出的错误,任何帮助都非常感谢。谢谢

使用exist出错
第一个存在的输入必须是字符串标量或字符向量。

TDMS_preprocessFile中的错误(第102行)
如果存在(indexFile,“文件”)

TDMS_readTDMSFile中的错误(第231行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第83行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

Year_3_Project_Code中的错误(第14行)
datacheck = TDMS_getStruct(LabViewFileName);

吉姆Hokanson

@George我可能已经解决了你的问题。如果没有,我将需要看到一个示例文件。无论如何,错误将更加具体(这是一个错误)。

吉姆Hokanson

@Charlotte @George Charlotte给我发了一些文件,里面有…复杂的数据!显然,这已经添加到规范,但显然它是缺乏在我的代码。我今天很忙,但我明天会试着上传一个修复程序。

吉姆Hokanson

看起来你只是在调用我的示例代码。该文件的顶部是需要填充的变量,以便让代码运行。此外,其中一些例子是特定于我的文件(不确定我是否上传了这些)。在现实中,如果你想使用这些例子,你会想用特定于你的文件的名称或值替换我的一些代码(例如,很可能你没有'Marker 0'组)。其中一些示例有点混乱,您最好只阅读整个文件,这有点令人困惑,最好使用TDMS_getStruct完成。最后,代码似乎不在您的路径上。您需要在路径中添加两个文件夹,一个用于根文件夹,另一个用于子函数文件夹。

乔治Iles

你好,我试图打开一个包含一些超声波数据的。tdms文件,我已经尝试了多个数据文件,但仍然收到相同的错误,我的一个同事能够使用相同的代码打开,有人也遇到了下面的错误吗,他们是否知道这是由于功能或.tdms文件。我是一个非常新的MatLab和任何帮助将不胜感激。

错误信息:
无法执行赋值,因为左边和右边有不同数量的元素。

TDMS_readTDMSFile错误(第280行)
groupIndices(curGroupCount) = I_groupObject;

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

ProcessUS_Basic中的错误(第18行)
d = TDMS_getStruct(文件名);%加载TDMS文件中的数据

> > TDMS_exampleFunctionCalls
无法识别的函数或变量'TDMS_exampleFunctionCalls'。

吉姆Hokanson

问题既出在我的代码上,也可能出在你的文件上。在我的代码中,我打开了“dataType”,但我没有一个处理的情况下,这些选项(0,11,27,或intmax)都没有遇到,所以变量“unhandledType”从未设置。我写代码的时候,大概只有这些选项。我的问题是,没有被匹配的dataType是什么。有可能规范已经更新了,所以存在一个我没有考虑到的新类型……

夏洛特紧身衣

吉姆,谢谢你的快速反应。我确实在代码中找到了TDMS_getDataSize代码中不适合我的地方:
否则
转换数据类型
例0
unhandledType = 'Void';
例11
unhandledType = '扩展浮动';
%SIZE: 12字节
情况下27
unhandledType = '扩展浮动单元';
%SIZE: 12字节
例intmax(“uint32”)
unhandledType = 'DAQmx';
%SIZE:已就此发送电子邮件
结束
错误('未处理的属性类型:%s',unhandledType)

然而,当我尝试打印unhandlesType时,我有以下错误:未定义的函数或变量'unhandledType'。我同意可能有一个问题与我的文件本身,但无法找出是什么。我会试着把我的文件发给你,看看你能不能帮上忙。

吉姆Hokanson

@Charlotte基本上,这是我代码中的一个小错误,但它表明文件本身存在更大的问题。如果您打开TDMS_getDataSize并进入该区域,您将看到我尝试用文字输入代码无法处理的数值数据类型。如果你发布被请求的数字数据类型,我可能会查看规范并提供进一步的见解(即在调用之前显示dataType或将其转换为该调用的数字)此外,如果你发送测试文件给我,我会查看它。

很抱歉没有看到你的留言,没有早点回复…

夏洛特紧身衣

你好,我在使用TDMS_exampleFunctionCalls和使用另一个论坛上提供的simple_test tdms文件打开代码时,遇到了与邵宇春相同的错误https://fr.mathworks.com/matlabcentral/fileexchange/44206-converttdms-v10.错误如下:
---------
未定义函数或变量'unhandledType'。

TDMS_getDataSize中的错误(第71行)
错误('未处理的属性类型:%s',unhandledType)

TDMS_preprocessFile中的错误(第326行)
rawDataInfo (objIndex) .numberOfValues * TDMS_getDataSize(数据类型);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_exampleFunctionCalls中的错误(第36行)
tempOutput = TDMS_readTDMSFile(filePath,params{:});
---------
我使用的文件路径包含所有matlab函数代码,我的simple_test。TDMS文件和simple_test。tdms_index文件。
我尝试在删除simple_test后使用相同的代码。Tdms_index文件,并且仍然存在相同的错误。
我尝试对最终能够加载的文件使用相同的代码(a_test_CM.tdms),但仍然出现相同的错误。
我试着在其他论坛上搜索,没有找到类似的主题。

有人能帮我们解决这些问题吗?

朱利叶斯·威廉

我和你犯了同样的错误:“头球意外领先”。

在我的例子中,我搞砸了.tdms和.tdms_index文件。详细说明:在我用TDMS_getStruct读取它之前,我复制了几个.tdms文件到一个新位置。结果我复制了。tdms并保存为。tdms_index。就是这样。

还要邵

我收到这个错误,非常感谢如果有人能给我任何帮助,非常感谢:

未定义函数或变量'unhandledType'。

TDMS_getDataSize中的错误(第71行)
错误('未处理的属性类型:%s',unhandledType)

TDMS_preprocessFile中的错误(第338行)
rawDataInfo (objIndex) .numberOfValues * TDMS_getDataSize(数据类型);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

test1中的错误(第6行)
filestruct = TDMS_readTDMSFile('C:\Users\Documents\simple_test.tdms');

吉姆Hokanson

@Fengshou原始DAQ MX数据以NI拒绝共享的专有格式保存。文件交换中可能有其他文件声称支持它。金宝app如果您有一个示例文件,并且擅长处理二进制数据,那么解析它通常非常简单。随时让NI知道你想让他们发布规格。

Fengshou顾

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

吉姆Hokanson

@Daniar我认为它被埋在输出的某个地方。在编写代码时,我不清楚如何将文件返回给用户,特别是由于无效变量名的问题。最后我写了很多不同的方法来返回你可以从中选择的数据。我建议检查TDMS_getStruct。数据在哪里应该更明显。如果不是,可能是文件没有正确保存…

Daniar法赫米

谢谢你的帮助。我可以运行程序,但是它只显示结构信息,我在工作空间中找不到我的数据(大约2*1000000)。我想我可以直接在那里读取数据。或许我还是用了错误的方法。

吉姆Hokanson

代码还需要将子函数文件夹添加到路径中。这样问题就解决了。

Daniar法赫米

我是Matlab的初学者。我已经在Matlab路径下添加了文件,并尝试输入
filestruct = TDMS_readTDMSFile(simple_test.tdms);
我得到了错误:

未定义函数或变量'TDMS_handleGetDataOption'。

TDMS_readTDMSFile错误(第216行)
TDMS_handleGetDataOption(“检查”,paramsStruct)

转换错误(第1行)
filestruct = TDMS_readTDMSFile('simple_test.tdms')

米甲Wilk

西奥卡米尔

西奥卡米尔

迈克尔Isnardi

谢谢你的快速反应,吉姆。我将尝试对该文件的副本进行碎片整理,看看是否产生了一个可以用TDMS Reader读取而不会出错的版本。请注意,我的文件可以读取到Excel没有错误使用NI的Excel导入器附加。此外,在使用启用DEBUG的代码后,我发现我的每个TDMS文件在包含TOC值为“0x0A”的段的第一个实例时产生下面的错误。

吉姆Hokanson

@Michael通常这表明文件没有被写入或关闭在Labview(或其他写入程序)正确。一个解决办法是在Labview中对文件进行碎片整理,它会尽力解决这些问题。我建议首先尝试对文件的副本进行碎片整理,因为我相信碎片整理VI会对原始文件进行重写。也欢迎你给我发一份文件,我可以试着看一下。

迈克尔Isnardi

吉姆,我得到了与下面@Aaron Thrasher相同的错误消息。我能够读取v1.3 TDMS文件没有问题,但v1.7 TDMS文件给出了以下一组错误消息:

---------------------------------------------------------------------
使用TDMS_preprocessFile错误(第450行)
剩余的数据没有被分割成块,估计块的数量:5.000000e-01

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});
--------------------------------------------------------------------

有什么想法可能导致这些错误,或建议可能的修复?

齐夫Arzi

嘿,吉姆,干得好!
我有一个建议,如果nargin==0,你可以使用uigetfile获取文件

例如:
如果nargin == 0
[temp_tdms_filename temp_tdms_path] = uigetfile(“*。tdms','请选择tdms文件');
tdmsFileName = [temp_tdms_path, temp_tdms_filename];
%error('输入到%s需要一个文件名',mfilename)
结束

布兰登·穆雷

斯蒂芬

吉姆Hokanson

是的,详情请看这里:
//www.tatmou.com/help/compiler_sdk/ml_code/function.html

基本上你只需要删除%#文本。假设你可以添加一个space => % # of bytes…(或者直接删除评论)

Micke表示

我最近开始得到这个错误:
警告:文件:TDMS_preprocessFile。m行:86列:21
无法识别的pragma“%#字节导入”。
TDMS_readTDMSFile中的>(第226行)
在TDMS_getStruct(第57行)

我最近安装了“MATLAB支持MinGW-w64 C/ c金宝app++编译器”,我想知道这是否与它有关。

吉姆Hokanson

嗨,克里斯汀,听起来你不是安装有问题就是路径有问题。我很好奇如果在命令窗口中键入path命令会得到什么。为了让事情不那么混乱,你为什么不给我发一封电子邮件,我可以试着帮忙。

克里斯汀Stubbendorff

嗨,吉姆,谢谢你这么快给我回电话。我已经尝试了你的建议,但最终出现以下错误信息。我试着在Matlab中打开TDMS_getStruct代码,看看我是否可以这样做,但这只会产生另一系列错误消息。我用的是2019a。

>>编辑matlab.internal.math.partialMatchString
使用编辑错误(第66行)
这种类型的变量不支持大括号索引。金宝app

吉姆Hokanson

@Christine,错误出现在程序的早期,它试图知道自'who'最后一次调用以来定义了哪些新变量。我现在使用了一种不同的(更好的)方法,但这种方法仍然有效。如果你去到错误的行(通过在命令窗口中键入编辑mat .internal.math. partialmatchstring,我使用2019a),我看到:assert(isstring(options) || ischar(options) || iscellstr(options))这对于'iscellstr'应该是真的-输入是字符串的单元格数组即cellstr。如果你看到同样的东西,我猜你正在用你自己的版本的iscellstr遮蔽iscellstr。-all iscellstr可能指示该代码的位置。看到//www.tatmou.com/matlabcentral/answers/418668-digraph-plot-bug-in-2018a对于类似的问题,但使用strncmpi。

吉姆Hokanson

你用的是哪个版本的Matlab ?

亚伦脱粒机

我从LabView生成的文件中做了很多tdms处理。最近,我们一直在处理来自我们的姐妹公司的文件,他们开发了自己的Labview程序来生成与我们类似的文件。曾经有一段时间,生成这些文件是没有问题的,然而,现在我们每次尝试读取它们的文件时都得到相同的错误。我们检查了他们LabView代码中使用的tdms文件格式的版本,它是2.0版本,我们认为这可能是问题所在,但这是最新的版本。下面是我们接收到的错误:
---------------------------------------------------------------------
使用TDMS_preprocessFile错误(第450行)
剩余的数据没有被分割成块,估计块的数量:5.000000e-01

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});
--------------------------------------------------------------------
如果有人能帮忙,我将不胜感激。excel导入器可以很好地处理文件,我们的替代方法是从excel中读取它,但是我们经常在大型文件中超出excel中的行数限制,必须打开多个excel文件才能传输所有数据。

奥尔多

补充我上次的评论
这些是我得到的错误
使用TDMS_processLeadIn出错(第33行)
头球意外领先

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

Untitled中的错误(第13行)
[final_output(i), Meta_struct(i)] = TDMS_readTDMSFile(文件{i});

嗨,我一直得到下面的错误消息。我不知道我做错了什么。的帮助!先谢谢你。
文件名= 'test.tdms';
my_tdms_struct = TDMS_getStruct(文件名);
使用matlab.internal.math.partialMatchString错误(第10行)
断言失败。
单元格错误/唯一错误(第102行)
foundflag = matlab.internal.math.partialMatchString(flag,flagvals);
cell/setdiff> cellset绕衍射2012a错误(第303行)
uA =唯一的(a,顺序);
cell/setdiff错误(第83行)
[varargout{1:nlhs}] = cellset绕射2012a(varargin{:});
TDMS_readTDMSFile中的错误(第148行)
constantParams = setdiff(who,temp);注意:下面我把这些放在
TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

吉姆Hokanson

@Tom,最大的变化是在2008年左右,他们引入了~操作符,以表明输出不应该赋值给变量。在此之前,人们通常会一遍又一遍地使用像“junk”这样的变量,这表明它并没有真正被使用。例如,你可以将“[~,~,fileExt] = fileparts(tdmsFileName);”改为“[junk,junk,fileExt] = fileparts(tdmsFileName);”。只是要注意不要选择一个我用作变量的名称。

汤姆·坎宁安

你好,先生!我无法通过第一个方格。我的客户给我提供了几个TDMS文件,我试图阅读它们,但我得到的都是
cspd = TDMS_readTDMSFile('current_speed_1.tdms');
???错误:文件:TDMS_readTDMSFile。m行:134列:3
表达式或语句不正确——可能不平衡(、{或[。

我运行的是R2007b,很旧了,而且我有段时间没用过MATLAB了,我在做什么蠢事?Mfile编辑器确实用解析错误标记第134行…

谢谢!

吉姆Hokanson

@Paul我以前见过这种情况,如果你使用高级TDMS vis来写文件。如果您没有正确关闭文件,也会发生这种情况。如果是后者,代码中的某些地方可以注释掉,基本上会返回部分读取的文件。你也可以尝试在Labview中整理VI,这可能会清理文件,这样我的代码就可以读取它。

保罗沙砾堕落

我有一个文件,似乎有一个奇怪的头。你对如何处理这件事有什么建议吗?错误信息如下:

my_tdms_struct = TDMS_getStruct(文件名);
使用TDMS_processLeadIn出错(第33行)
头球意外领先

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

吉姆Hokanson

@Akhil我建议尝试使用'TDMS_getStruct',这将以一种更容易使用的方式解析信息。第二个输入(在文件路径之后)接受数字1-4,您可以使用它来选择如何创建结构。如果你仍然遇到问题,请随时跟进。

(Akhil Bheemreddy

我想访问TDMS文件的根信息,如标题、作者、组等。我可以在哪里使用readTDMS函数访问这些信息?当使用getall时,该信息不能在FinalOutput或metaStruct中找到。

Med Aymane Ahajjam

Ziyad Smoqi

我得到以下错误:

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

吉姆Hokanson

@Lekha,看起来你可能编辑了我的内部代码,你不应该这么做。也许是因为它找不到你的文件?如果是这种情况,您可能需要使用绝对文件路径(例如,'C:\my_work\CAN_data.tdms')。请尝试将我的代码更改为原来的样子(如果需要恢复到原来,请考虑重新下载)。当前的错误来自于您在代码的第129行中将文件名指定为变量而不是字符串(即没有单引号)的更改。

Lekha大卫

我运行了这个简单的代码行:filestruct = TDMS_readTDMSFile('CAN_Data.tdms');

我得到了以下错误:
未定义变量“CAN_Data”或类“CAN_Data.tdms”。

TDMS_readTDMSFile错误(第129行)
如果存在~ (CAN_Data.tdms,“文件”)

Untitled中的错误(第1行)
filestruct = TDMS_readTDMSFile('CAN_Data.tdms');

安德鲁•加尼姆

我还遇到了DAQmx数据格式转换问题,但是NI网站上有一个VI发布,它将DAQmx原始文件转换为标准TDMS文件,然后该文件可以用这个实用程序转换为Matlab。我对两者都心存感激。:)搜索“使用LabVIEW转换TDMS文件与DAQmx原始数据”。

吉姆Hokanson

@Jeroen在我写这段代码的时候,我写的是准确性,而不是速度。有时我想回到过去,使它更快,但由于我不再使用这段代码,我没有麻烦-太多其他的事情要做!代码解析头信息的速度相对较慢,如果你使用Labview对其进行碎片整理,阅读速度会快得多。在许多情况下,每当您将数据写入文件时,都会创建一个新的头来描述数据。对文件进行碎片整理将合并所有数据并删除大部分头文件,这将显著加快读取速度。我希望您的索引文件在整理碎片后会大幅缩小(大约几KB)。在我的工作中,我经常会有几GB大小的TDMS文件,可以很好地读取(在几秒钟的顺序)。在Labview中,诀窍是将收集到的数据管道到队列中,然后有一个单独的循环,将队列中的数据以较低的速率写入文件(可能是每秒一次-而不是几毫秒一次)。注意,这是10多年前的事情了,Labview可能有更好的方法来指定写入频率。

嘿,
我有一个大的(1.2GB) TDMS文件,我需要读入matlab。我首先运行你的代码来加载一个测试文件(52MB),我在网上找到了一个完美的测试文件。当尝试使用TDMS_readTDMSFile或TDMS_getStruct函数加载我的文件时,它需要永远的时间(我在2小时后取消了它)。
在尝试了以下方法后,所有这些方法都没有帮助,我认为运行时间过长不是由于文件的大小,而是其他问题:
-在我的数据文件文件夹中有索引文件(49mb)没有帮助。
-我尝试先获取元数据,以便以2种方式读取数据通道:
将GET_DATA_OPTION参数设置为“getnone”
运行TDMS_readChannelOrGroup(文件名,1)
上面两个都需要花费很长时间,我在得到任何输出之前取消了它们(我让它运行的最长时间是30分钟)。

在没有索引文件的情况下,在52MB的测试文件上运行上述任何程序大约需要0.5秒。

你知道哪里出了问题吗?
提前感谢你的帮助

之浩

吉姆Hokanson

看起来你在传递字符串'filename'而不是变量filename。要修复此问题,请在函数调用中删除filename周围的单引号。

之浩

嗨,吉姆。
谢谢分享!我尝试读取一个tdms文件(大约800M)。遵循ing is my main code and still some error,could you give me some advice.
clc
清除所有
filename = uigetfile(' amp1v_fre5 .tdms');
% my_tdms_struct = TDMS_getStruct(文件名);
测试= TDMS_readTDMSFile(文件名)
y = test.data
m = y {3};
n = m (1:3 * 2000000);
使用TDMS_readTDMSFile错误(第130行)
指定用于tdms读取的文件不存在,FILENAME: FILENAME

主错误(第5行)
测试= TDMS_readTDMSFile(文件名)

吉姆Hokanson

嗨,阿里,请阅读下面关于“原始”数据的其他讨论。这是一个专有的Labview格式,我看不懂。

阿里Golabchi

嗨,吉姆。
谢谢分享!我确实添加了路径中的所有内容,但我在使用时得到以下错误:filestruct = TDMS_readTDMSFile('filename.tdms');

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

任何想法?

最好的

管理

也非常快!

吉姆Hokanson

嗨,冬青,

首先需要确保所有函数都在搜索路径上。如果我没记错的话,你需要添加根文件夹和tdms子函数文件夹到你的路径。在Matlab的工具栏Home => Set Path下,您将得到一个GUI,它将帮助您将文件夹添加到路径中。

完成此操作后,最简单的用法是调用:filestruct = TDMS_readTDMSFile('filename.tdms');如果您遇到了特定的问题或错误,请随时在这里发布或给我发电子邮件。

霍莉·戴维斯

我对Matlab比较陌生,运行这个程序有困难,在运行程序之前,我需要重命名我的文件或者做些什么吗?

Kuenwei吴

谢谢吉姆分享这个包裹。代码运行得很好。

超级有用。非常感谢!

吉姆Hokanson

@Ahmed我关于过早结束数据收集的评论仍然有效。如果没有Labview,你很可能需要尝试提前停止读取,只返回整个部分。换句话说,捕捉错误(在读取器代码中)并在此时停止元解析。不幸的是,我现在有点忙,所以我不能自己做这些修改。注意,使用这种方法,您只能获得部分数据,但这通常已经足够了……

艾哈迈德Rageh

@Jim Hokanson我没有使用Labview记录这些文件,我不知道如何做到这一点。我使用STS Live软件。

吉姆Hokanson

@Ahmed通常这种情况发生在文件没有被正确关闭时(即程序退出而没有关闭文件)。我认为整理文件-使用Labview -将解决这个问题(尽管最好做备份)。如果你仍然有文件的问题,你可以发送一个例子文件给我,这是不工作的,我可以看看它。

非常好的代码,我在我的博士工作中使用过它。
现在,我得到估计#块错误,我怎么能修复它?

"使用TDMS_preprocessFile时出错(第450行)
剩余的数据不会被分割成块,估计块数量:1.178519e-03"

" TDMS_readTDMSFile中的错误(第227行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);"

谢谢

保罗Lungu

非常好用的工具,谢谢你,吉姆。

吉姆Hokanson

@doyi joo你看到的是一个单一的错误,即我的代码无法处理原始DAQ MX数据。这是NI尚未发布规格的专有格式。关于此事的其他讨论见下文。如果你想在Matlab中阅读这些文件,我通常建议你在Labview中使用非原始格式来阅读和重写这些文件。

J J

你好,

如何修复这些错误?
使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

NI_data_processing中的错误(第10行)
my_tdms_struct = TDMS_getStruct('600_idle.tdms');

吉姆Hokanson

@StoneCold555

这个库的解析性能可以显著提高,特别是在元数据的解析方面。但是,如果对文件进行碎片整理,通常可以显著加快解析速度。我曾经在Labview中这样做,我将加载所有的文件,并通过碎片整理TDMS vi运行它们。这删除了所有的写头,因此基本上你只得到一个头,然后是数据的二进制转储。

StoneCold555

StoneCold555

@Jim Hokanson,首先感谢你的剧本。
我必须读入数百个TDMS文件,我的问题是处理时间。不管我阅读的TDMS文件是5列还是50列,花费在阅读上的时间几乎是一样的。
有办法改善吗?
谢谢

吉姆Hokanson

@Wolfgang_Send谢谢你提到使用示例。使用文档肯定可以改进,尽管我更倾向于重写接口代码!因为我不再使用TDMS文件,所以它的优先级非常低。我已经把你的例子加到描述里了。

吉姆Hokanson

@Shen_Chiu我更新了描述,提供了一个链接到一个要点,显示如何只检索部分数据。它包含一个到示例TDMS文件的链接,您可以使用该文件来运行示例。就像太多的代码一样,所有这些都是在匆忙中创建的,选项界面非常尴尬。为了更具体地解决您的问题,所有tdms数据都存储在父组的一部分通道中。数据数组由它们的组和通道唯一标识。例如,您可能有“Electrode1”、“Electrode2”等组,然后每个组都可能有一个“Channel1”通道。您的具体示例位于底部,尽管它需要定义'm',它在文件中稍高一些。

沈赵

嗨,吉姆,你能否提供一些例子,说明如何读取数据的特定子集。仍然不清楚如何从TDMS_retrievingSubsets.m中提供的示例检索数据子集。我搞不清楚这些myGroup和myChannel是什么。

Wentao赵

爆炸狮子座

沃尔夫冈发送

致可能难以读取TDMS文件(NI)的所有用户。我最近下载的2.5版本非常简单高效。只需在包含上述文件的目录中根据需要编写MATLAB文件即可。所需要的第一行代码是:>filestruct = TDMS_readTDMSFile(filename.tdms);变量filestruct由12个字段组成,其中包含所有数据(包括原始数据)。就是这样。你,吉姆,知道这一点——多亏了你的工作!这条评论针对的是像我这样的用户,他们最初对示例文件和其他永远不需要阅读的文件感到困惑。MATLAB变量结构表告诉你所有你需要的信息和在哪里找到。一揽子计划兑现了它的承诺。

吉姆Hokanson

@Kah Boon Ho,
表名不是有效的可选输入。TDMS_retrievingSubsets指定大多数有用的有效可选输入,因此类似这样的东西可能工作(未测试)
Og = struct;噩。fullPathsKeep = [];噩。groupsKeep = {'Sheet2','Sheet4'};[finalOutput,metaStruct] = TDMS_readTDMSFile('filename.tdms','GET_DATA_OPTION',' get子集','OBJECTS_GET',og)

马修Brunstein

@Jim,

在使用getStruct函数进行数据转换时,我注意到一个奇怪的问题。这似乎是价值观的不同。当我在excel tdms查看器中打开数据并将数据与matlab数据进行比较时,值存在差异。

贾文浩

@Jim
请问我如何从tdms文件中读取具体的表格?我尝试[finalOutput,metaStruct] = TDMS_readTDMSFile('filename.tdms','Sheet2','Sheet4'),它仍然是提取表1数据。

吉姆Hokanson

@Marc

我不确定我是否遵循....你是否读到了时间信号给出了非等间距点?换句话说,如果你在数值数组上调用类似plot(data)的东西,这些点将总是等距的,因为x值只是样本数....请随意发给我一个示例文件或澄清,因为我不确定我是否理解

Marc Rico

感谢吉姆创造了这个不错的工具。

当我用TDMS_readTDMSFile函数读取我的文件* .tdms时,我有一个问题/问题。如果我用点格式表示导入的数据,它们看起来好像是等距分布的,即y轴上的“线”。但是,如果我使用LabView将*tdms文件转换为*txt,则不会发生这种情况。你知道会发生什么吗?我错过了什么?

再次感谢您提供这个工具

史蒂文希望

杰森刘

吉姆Hokanson

@Andy

首先想到的是,这听起来像是数据形状的问题(即行和列的#)。如果不是,这可能也是一个数据类型的问题(即单对双),尽管我希望大多数Matlab的过滤器转换为双计算,但也许不是?如果你给我一个示例文件和示例代码,我很高兴看到它。

安迪•柯林斯

吉姆,谢谢你创造了这样一个有用的工具。我有一个问题,希望确定我在过滤数据时得到的奇怪结果的来源,数据被读入Matlab。在使用TDMS阅读器将数据读入Matlab后,我尝试对数据应用高阶切比雪夫滤波器,结果得到一个渐近上升的信号。但是,如果我将tdms文件中的数据复制到一个文本文件中,将文本文件中的数据上传到Matlab,并使用相同的过滤器处理数据,我就可以使过滤器充分地执行。我是否遗漏了使用TDMS Reader读入Matlab的数据格式。我欣赏任何见解,因为我对过滤结果中的差异感到疯狂。干杯! !

Paula Sanz-Leon

吉姆Hokanson

@Ahmed,

我认为这通常发生在使用“高级TDMS”编写vi时,它绕过了一些正常的文件布局要求。或者,如果写作被打断,我也能看到这种情况发生。我猜如果您使用了高级调色板中的任何一个VIs,您就会知道。一种可能的解决方法是在错误发生后停止读取文件。如果你和我取得联系,你可以发给我一份文件看。

艾哈迈德Rageh

我尝试使用阅读器,但我得到以下错误

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计块数量:3.907886e-03

TDMS_readTDMSFile错误(第227行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

有人知道原因吗?

李Bjornestrand

理查德•福特

谢谢,我让NI用户改为导出到TDMS。简单的解决方案。

吉姆Hokanson

@Richard

TDMS和TDM是非常不同的文件格式。此代码不支持TDM。金宝app对于通用阅读器来说,最好的选择是使用以下方法将TDM文件转换为TDMS:
http://zone.ni.com/reference/en-XX/help/371361H-01/glang/convert_to_tdm_tdms/
文件格式为:
http://zone.ni.com/reference/en-XX/help/370858N-01/tdmdatamodel/tdmdatamodel/tdm_fileformat/

创建一个基本的阅读器应该很容易,因为它的格式本质上是xml和二进制数据转储。随时给我发信息,我们可以谈谈你需要写大约10 - 15行代码来获得你想要的数据。

理查德•福特

嗨,吉姆,这段代码是否处理tdm数据结构(即.tdm定义和.tdx数据文件)?如果没有,有什么建议吗?
谢谢

吉姆Hokanson

@Kathrin还有其他一些想法。首先,Matlab并不总是很好地处理文件名编码。如果你的文件名(或路径)不是ASCII码,你可能会遇到问题(见Kostyantyn 2017年11月的帖子)。您可能还会遇到tdms索引文件的问题,但我不确定具体是什么问题。

如果在TDMS_preprocessFile中初始化输出之前将下面的代码输出放在右边(大约在第136行左右),那么了解下面的代码输出可能会有所帮助
disp (isIndexFID)
disp (tdmsFileName)

如果你给我发消息,我也很乐意私下协调调试,直到达成解决方案,我可以与他人分享。

凯瑟琳Giefer

谢谢你吉姆。路径是正确的,正如其他人已经描述的那样,fid是正常的,直到出现错误消息,它们突然变为-1。数据是正确的,当从smetc读取基于labview的程序时,我可以看到数据头,但在保存到变量之前会遇到错误。上周我尝试了很多,改变了文件,等等,没有机会让它运行。进一步推荐:我只是给文件夹与tdms文件....用正确的路径。代码读取单个文件:为什么有一个文件,它被打开,然后读取失败?结构改变了吗?非常感谢你的帮助!

吉姆Hokanson

@Kathrin这种消息通常表明文件没有被正确打开,通常是因为它不存在。我面前没有代码,理想情况下,我应该检查fid是否有效,但要确保文件路径正确。请注意,相对文件路径很可能不受支持,您需要指定文件的完整路径。金宝app

凯瑟琳Giefer

使用fseek时出错
无效的文件标识符。使用fopen生成有效的文件标识符。

TDMS_preprocessFile中的错误(第155行)
fseek (fid, 0,1);

TDMS_readTDMSFile错误(第227行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

有人知道我在哪里可以找到它的解或描述吗?

吉姆Hokanson

我偶尔会看到没有正确关闭的文件。你可以通过在TDMS_preprocessFile中第179行左右添加以下代码来选择忽略这些错误:

处理含铅量百分比
%======================================================================
试一试
[flags,info] = TDMS_processLeadIn(fid,lastLetter);
抓住我
nSegs = nSegs - 1;
打破;
结束

此外,有些文件加载非常慢,不是因为文件大小,而是因为样例一次写入一个到磁盘。如果你能运行TDMS碎片整理。vi对文件(使用Labview),它将删除很多不必要的开销和加快读取文件。修改vis时请小心,并考虑在文件副本上运行碎片整理。举个例子,我刚刚处理的一个文件最初加载大约需要30秒,而在对其进行碎片整理后需要0.16秒。

康斯坦丁·Pryymak

不确定原因,但每次我试图读取名为“Aufnahme 13”的文件时都会发生错误。tdms”(在德语中是测量13的意思)
#使用TDMS_readFileHelper_v1错误(第184行)
#检测到灾难性错误,代码可能在某个地方有错误
重命名这样的文件可以解决问题。

maocaimarshal

吉姆Hokanson

@Brandon -时间应该作为Matlab数据enum值,这样在值上调用datestr()应该显示日期。但你的价值并没有太大意义。我不太确定您所说的“绝对时间”TDMS文件是什么意思。另外,我很好奇您是否正在读取以其他方式保存的时间戳或数据,可能带有指示开始时间的属性。请随意发给我一个样本文件,我可以看看。

不确定是否会看到这个问题,但是——时间是如何格式化的?在一些绝对时间TDMS文件上运行MacOS Matlab 2016a。时间的输出在70000秒范围内。起初,我假设是UNIX纪元,但是70,000相当于8天的秒。此外,30秒在这些单位中约为。00034。我忽略了什么显而易见的东西?

谢谢,
布兰登

本贾

非常好

巴普蒂斯特Anceau

你好吉姆,

在运行TDMS_exampleFunctionCalls从.tdms文件中提取数据时,我遇到了与Henrik在2013年10月的帖子中相同的问题:

使用fseek时出错
无效的文件标识符。使用fopen生成有效的文件标识符。

TDMS_preprocessFile中的错误(第155行)
fseek (fid, 0,1);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_exampleFunctionCalls中的错误(第36行)
tempOutput = TDMS_readTDMSFile(filePath,params{:});

因为我没有看到任何关于这个话题的答案,所以我转发了这个话题。你知道发生了什么吗?

“fid”在第一次调用预处理函数且没有发生错误时等于3。当错误发生时,“fid”等于-1(我不理解)。

所选路径指向一个只包含一个.tdms文件的文件夹。

非常感谢,

巴普蒂斯特

罗摩克里希纳

大家好。我需要你们帮个小忙。我需要一个matlab代码转换一堆TDMS格式文件在excel格式文件。在每个tdms文件中,我有20000行和2列的值。

问题是我有大约150个tdms文件,所有的文件都需要一次转换。

请帮我做这件事。我已经尝试了几个月了,但我不能。我将等待您的回复。谢谢大家。

Alex5

你好吉姆,

首先,非常感谢您创建这些有用函数的所有工作。

我有问题使用readTDMSFile为使用NI的高级TDMS VIs创建的TDMS文件。

使用TDMS_processLeadIn出错(第33行)
头球意外领先

TDMS_preprocessFile中的错误(第179行)
[旗帜,信息,eof_error] =
TDMS_processLeadIn (fid, lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct =
TDMS_preprocessFile (fid, tdmsFileName paramsStruct);

我创建了一个小的LabVIEW测试程序。对于使用TDMS Open > TDMS Write(写入6个U16值的数组)> TDMS Close生成的TDMS,我没有得到错误。
但是,如果我使用高级功能TDMS高级打开> TDMS设置通道信息> TDMS高级同步写> TDMS高级关闭,那么我就会得到上面的错误。

我编辑了你的函数,这样lastLetter和mtag的值将被打印出来,奇怪的是,mtag在错误消息之前被打印在命令行中两次(见下文)。
对于使用非高级函数生成的TDMS,不会出现这种情况。根据我对代码的理解,第二个值mtag = 0可能是导致错误的原因。

temp = TDMS_readTDMSFile(fullfile(testDirectory,fileNames{iFile}))

lastLetter =

109

mtag =

109

mtag =

0

请帮助!

谢谢

Alex5

吉姆Hokanson

@Jessica

我已经很多年没有看过了,我也不再经常使用TDMS了。我能够使用一个玩具示例获得一个解析器。我认为数据通道只是包含原始的DAQ数据,在我的情况下,一个16位整数,然后需要根据与通道相关的属性进行缩放(缩放和偏移量)。我似乎记得在读取实际数据之前还需要跳过大量字节。我可以通过输入一个已知的信号,然后将奇数或偶数的起始字节集转换为int16并绘图来告诉它。例句:

%可能需要在结尾删除一个字节,以便拥有偶数个字节
定型(数据(1:结束),“int16”)
定型(数据(2:结束),“int16”)

最好的方法是在Labview中转换数据。看到的:
https://decibel.ni.com/content/docs/DOC-32817

抱歉我帮不了你。
祝你好运。
吉姆

杰西卡•帕克

你好再次,

对于任何人试图读取原始DAQmx数据,这个快速LabVIEW转换器(https://decibel.ni.com/content/docs/DOC-32817)结合吉姆的TDMS阅读器对我来说工作得非常好。

编辑:谢谢你,吉姆!我应该刷新页面的!现在我知道我只得到一条评论。

欢呼,
Jes

马克西米利安

肯尼斯·金

吉姆Hokanson

你好斯蒂芬,

您需要将TDMS_readTDMSFile中的MACHINE_FORMAT更改为所需的值。如果您希望能够在代码中来回切换,而不让它变得很硬,那么您需要将赋值行向下移动,例如,移到UTC_DIFF行之后。然后,您可以将该值作为选项传递给TDMS_readTDMSFile或TDMS_getStruct作为第三个输入,例如TDMS_getStruct(file_path,[],{'MACHINE_FORMAT','b'})

吉姆

斯蒂芬,他

嗨,吉姆,

我想使用你的功能。但是现在我遇到了麻烦,因为我的数据是大端格式的。你知道怎么把文件转换成小端序格式吗?

最好的问候,
斯蒂芬

杰里米

吉姆Hokanson

你好马库斯,

很抱歉耽搁了。还有一个bug,我知道它不是正式规范的一部分,但偶尔会在用户中出现。幸运的是,它会导致一个显式的错误,所以我并没有真的试图太努力去修复它,特别是当我联系NI的时候,他们不知道发生了什么。你的问题可能是这个bug,也可能是别的什么。一个通用的解决方案是使用Labview对文件进行碎片整理,这往往会删除奇怪的边缘情况,也会使读取速度更快。如果你仍然有问题,你可以发给我一个示例文件,我会看看它。

吉姆

马库斯Stutika

你好吉姆,

首先,我非常感谢您为TDMS文件导入所做的工作。代码很棒,适用于许多文件。

不幸的是,我有一些文件的问题:

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计块数量:2.439024e-002

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

TDMS_IMPORT错误(第34行)
Assignmentfile = TDMS_getStruct (mstDir.name);

我在评论中看到,这个话题已经有人问过了。所以也许这个问题已经解决了,或者至少你对根本原因有了一个想法,但它看起来像你通过电子邮件回答的。你能分享一下答案吗?

非常感谢!

马库斯

Ulf Schaper

我必须编辑TDMS_dataToGroupChanStruct_v4的第52行。让脚本为我工作。我插入了一个genvarname()调用,即。

groupStruct。(genvarname (TDMS_genvarname2 (chanStruct.name,……
REPLACE_STR,PREPEND_STR,ALWAYS_PREPEND)) = chanStruct;

背后的原因是,提供的TDMS_genvarname2()函数不会生成MATLAB变量名,以防它们包含变音。
TDMS_genvarname2使用isstrprop检查字符串是否为字母数字,但是变音符是字母数字,即使它们不能包含在变量名中:
Isstrprop ('"(Üüß','alphanum') == [0 0 1 1 1]

(我不想改变TDMS_genvarname2本身,因为我害怕副作用——这就是为什么我修改了TDMS_dataToGroupChanStruct_v4。i’我在我当地的TDMS阅读器。)

吉姆,非常感谢你的软件!

吉姆,

谢谢你的回复。这些文件是由一个自主的数据记录器VI编写的。我将看看我是否可以从这一端解决这个问题,因为我们目前正在从一个非常高的级别处理tdms文件。还有很多选项/参数我们还没有探索。谢谢你对可能原因的解释,它给了我很多工作要做。

埃文

吉姆Hokanson

你好伊万,

我所知道的错误是:1)在极少数情况下,在标题中有一个我不完全理解的优化,即使在联系NI之后。幸运的是,这是一个显式错误(尽管我认为它会出现在“块”计算部分),而不是一个无声的错误,在这个错误中,您认为一切都好,而实际上并非如此。如果您在tdms文件上运行defragmention vi,则此错误将被修复。2) Labview最近开放了直接写入文件的某些参数的能力(我认为在“高级”tdms部分)。如果你写错了(例如,你写了10个字节的数据,而实际上只写了5个字节),就会导致问题。3)如果你没有正确地关闭文件,有一个脏位,应该抛出一个错误(即,我认为它得到了坏的最初,并设置为好时,一个段被正确地写入)。然而,这会抛出一个不同的错误。

您看到的特定错误基本上是一组4个字节,应该在每个段的开头。如果我没有看到这些字节,那么不知何故,代码没有读取它应该在哪里。我可以对规范中有些多余的东西进行很多其他检查,但这个错误基本上是说我不知道哪里出了问题。您非常欢迎向我发送文件(通常通过链接下载),导致这个问题,我将看看我是否可以以某种方式更新代码。

吉姆

埃文·卢卡斯

这段代码很棒,在我运行过的99.9%的文件中都运行良好。我偶尔会遇到一个文件,它会返回一个错误-“使用TDMS_readFileHelper_v1的错误(第184行)检测到灾难性错误,代码可能在某个地方有错误”

TDMS_readFileHelper_v1(如下所示)中的179-185行测试什么?在抛出错误的文件上是否缺少一些标准的.tdms头信息?

Ttag = fread(fid,1,'uint8')
Dtag = fread(fid,1,'uint8')
Stag = fread(fid,1,'uint8')
Mtag = fread(fid,1,'uint8')
if ~(Ttag == 84 && Dtag == 68 && Stag == 83 && mtag == 109)
错误('检测到灾难性错误,代码可能在某处有错误')
结束

吉姆Hokanson

@spoon,

抱歉,我没有对应的代码。由于元数据是xml格式的,而不是二进制格式的,因此提取所需信息可能会更容易一些。

吉姆

勺子

嗨,吉姆。
在TDMS的地方,我有tdm和tdx测量数据,我需要将其转换为.mat格式。

如果您对此有一个代码,将会有很大的帮助。

吉姆Hokanson

嗨,杰夫,

你能先在Labview中整理一下文件吗?如果还不行,请给我发一个例子,我来看看。

吉姆

杰夫

嗨,吉姆,

我已经成功地使用你的代码一段时间了,但它现在给我一个错误,我以前没有见过。

使用TDMS_readFileHelper_v1错误(第188行)
检测到灾难性错误,代码可能有错误
的某个地方

TDMS_readTDMSFile错误(第252行)
data =
TDMS_readFileHelper_v1(支撑材、optionStruct metaStruct paramsStruct);

TDMS_getStruct中的错误(第57行)
(临时metaStruct] =
TDMS_readTDMSFile (filePath readOptions {:});

这可能是由于tdms文件有大量的组,还是我还遗漏了什么?

谢谢!
杰夫

Stefan

嗨,吉姆,
我也有'意想不到的头'错误,但当我尝试修复你提到:
“这个问题可以通过替换你所看到的错误来解决:
Flags = [];
Info = [];
Eof_error = true;
回来,“

我得到一个错误:
警告:文件未正确关闭。
文件末尾的数据很可能会丢失
在赋值A(:) = B中,A和B中的元素数量必须相同。

TDMS_readFileHelper_v1中的错误(第148行)
数据{I_object} (startI: endI) =
从文件中读(支撑材、numValuesAvailable precisionType{数据类型});

TDMS_readTDMSFile错误(第252行)
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

任何想法?
Stefan

吉姆Hokanson

@Benoit

我不知道是什么导致了你提到的问题。你能给我一个有这个问题的例子文件吗?我会发私信告诉你更多细节。

吉姆

Benoit

嗨,吉姆,

谢谢你的工作。
我尝试使用您的代码,我没有任何错误,但我得到的文件是空的。我的原始文件是70Mo,最终文件只有10Mo。
你有什么线索能帮我吗?
非常感谢。

Benoit

吉姆Hokanson

@David

我真的很想改变这个界面:/

问题是输入应该是一个包含字符串的数组结构。

getStruct。Group = '6120';
getStruct。channel = 'Untitled 3';

如果你需要更多帮助,请随时发邮件给我。

吉姆

大卫DeVilbiss

吉姆,

早在2014年2月22日,Joe Cuschieri有一个关于使用你的函数读取数据段的问题。我得到了相同的误差。你有没有给他一个解决方案或者一些简单读取数据段的示例代码。

谢谢你,戴夫

乔纳森·柯里

伟大的代码,第一次工作,只是它应该!

吉姆Hokanson

@Joe,

国家仪器公司不会公布他们daqmx格式的规格(我已经问过了),所以我不知道他们的二进制数据意味着什么。他们最近更新了他们的dll,以支持读取版本2的文件,所以你可能会幸运地金宝app使用它。我一直想看看dll,但它在我的优先级列表中真的很低。

到dll的链接可以在这个页面找到:
http://digital.ni.com/public.nsf/allkb/A3663DE39D6A2C5A86257204005C11CA

曾经有一个特定的页面用于dll(它说它只支持版本1,然后最近版本2),但我再也找不到它了。金宝app

祝你好运,如果你还有任何问题,请随时给我发邮件。

吉姆

你好,

当我尝试使用TDMS_readTDMSFile时,我得到一个奇怪的错误:

它告诉我:
"使用TDMS_processLeadIn出错(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);"

该程序是否适合处理原始DAQmx数据?如何避免这种错误?

吉姆Hokanson

@Bob,

很抱歉出现了这样的错误信息。在我正在开发的新版本中,我希望提供关于每个错误消息实际含义的冗长文档的链接。tdms文件的每个部分都以字符tdsm(数据文件)或tdsh(如果它是索引文件)开始。如果这些不存在,则表明在解析文件或写入文件时出错。我认为每次我看到这个错误,问题是文件没有正确关闭(在Labview中使用tdms关闭),最后一段已损坏。

这个问题可以通过替换你所看到的错误来解决:
Flags = [];
Info = [];
Eof_error = true;
返回;

如果您还有任何问题,请随时通过电子邮件与我联系。

吉姆

鲍勃

我正试图帮助一位同事解码一条消息,他正在阅读我正在创建的tdms文件。我们读了很多文件,偶尔会看到以下格式的错误:

获取TDMS struct错误:2013-10-17 16_50_15_902.tdms
带有属性的MException:

标识符:“
消息:'头中的意外引导'
原因:{0x1 cell}
堆栈:[6x1 struct]

是否有任何东西可以解释这个错误的含义,以便我可以纠正它?

谢谢!

吉姆Hokanson

@Kadir,

请通过电子邮件与我联系,或者向NI投诉。

吉姆

Kadir也

@吉姆,

非常感谢你的澄清。我没有Excel。我尝试了dll,但它只需要样本的前1000个值。因此,我倾向于第三种选择。

你说的“正则数组”是什么意思,我如何进行这种转换?

再次感谢,卡迪尔

吉姆Hokanson

@Kadir,

该标志在每个段上更新,并且在整个文件中不是恒定的。这种类型的数据的格式不是由NI指定的,即使在我请求它之后。备选方案包括:
-试用Excel TDMS阅读器
-尝试他们的新dll代码,可能支持原始DaqMX代码金宝app
-将Labview中的数据从Raw DaqMx转换为常规数组,然后使用我的代码

如果你还有任何问题,请随时给我发电子邮件。

吉姆

Kadir也

你好,

我得到了错误“当前代码无法忽略/处理原始Daq MX数据”。然后,我查看了TDMS_processLeadIn,第49-51行:

如果flags.hasRawDaqMX
错误('当前代码无法忽略/处理原始Daq MX数据')
结束

然后,我检查了“flags”结构的“hasRawDaqMX”字段的值。结果是0。那么,我就不会得到在第50行实现的错误,对吧?

有人知道这是怎么回事吗?

提前谢谢你,卡迪尔

哈利

@Jim

非常适合我!太棒了!

非常非常感谢!!!!!

吉姆Hokanson

@Harry,

您还需要将tdmsSubfunctions文件夹添加到路径中。我最初把它们放在一个单独的文件夹中,以便更明显地显示哪些函数可以调用,哪些函数不可以调用。很抱歉造成了混乱。

吉姆

哈利

嘿,吉姆,

我对你的代码有问题。
如果我想转换一个.tdms文件,我总是收到错误。

例如:
>> filename = 'C:\Users\*****\Desktop\v2p5\tdms\Messdaten.tdms';
my_tdms_struct = TDMS_getStruct(文件名);
未定义函数'TDMS_handleGetDataOption'用于类型为'struct'的输入参数。

TDMS_readTDMSFile错误(第216行)
TDMS_handleGetDataOption(“检查”,paramsStruct)

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

你能解释一下,有什么问题吗?

吉姆Hokanson

你好,

我最近在我的代码中遇到了一个错误,我预计它会影响很少人,但对大多数人来说,它很可能会抛出以下错误:“剩余的数据没有被分割成块。”话虽如此,这是一个bug,我会尽快修复。据我所知,如果偶尔决定不写入一组通道的子集,而在其他时候写入整个组,则会导致问题。喜欢的东西:

如果case1
通道= 1:3
其他的
通道= [1 3]
结束

在我看来,这个错误实际上违背了NI文档,所以我需要联系他们澄清。

详情如下。

非常感谢Junghwan Kim给我发送了一个示例文件,让我最终理解了这个问题。

吉姆

亨瑞克

这就跟你问声好!

在您的示例文件“TDMS_exampleFunctionCalls”中运行步骤2、3和4时,我得到以下错误。
你能帮帮我吗?

使用fseek时出错
无效的文件标识符。使用fopen生成有效的文件标识符。

TDMS_preprocessFile中的错误(第155行)
fseek (fid, 0,1);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

致以最亲切的问候
亨瑞克

吉姆Hokanson

@Navid,

鉴于NI不会发布RawDaqMX数据的数据格式规范,您的选择如下:
1)告诉NI你想要发布规格
2)参考答案:
3)试试这个:
http://www.ni.com/white-paper/4906/en

祝你好运

Navid

亲爱的吉姆,
谢谢你的快速回答,
你对错误代码的看法是正确的,但在使用你的代码后,我得到了与陪审团和简相同的错误,不幸的是,我无法重新保存数据,有其他方法来解决这个问题吗?!

多谢. .

吉姆Hokanson

@Navid,

看起来你可能使用了不同的代码:
//www.tatmou.com/matlabcentral/fileexchange/28771-converttdms-v9

我建议您改用我的代码。如果你还有问题请告诉我。

吉姆

Navid

亲爱的吉姆,
首先非常感谢你的代码,我有一些TDMS文件的问题,你能帮助我吗?!我明白了:
将“ADC_20130808_165723.tdms”……未定义的函数或变量'TDMSFileNameShort'。

convertTDMS>getSegInfo错误(第405行)
e = errordlg (sprintf ([' Seqment %。0f within ''%s'' has interleaved data which is not
金宝app支持这个'…

convertTDMS中的错误(第276行)
[SegInfo, NumOfSeg] = getSegInfo (fid);

Junghwan

嗨,吉姆,

首先,我非常感谢您的代码。

我得到了和罗伯特和菲奥娜一样的错误。
看起来你通过邮件回复了菲奥娜。你能和菲奥娜分享一下你的答案吗?

很多谢谢!

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计#
块:5.000000e-01

TDMS_readTDMSFile错误(第226行)
metaStruct =
TDMS_preprocessFile (fid, tdmsFileName paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

CLF

吉姆Hokanson

@Jane

简短的回答是,没有解决方案。原始Daq MX数据的格式是专有的,NI拒绝了我的文档要求。

如果你仍然想使用我的代码,最简单的方法是使用Labview读取数据文件,并重新保存不使用Raw Daq MX的数据。

你好!

我和陪审团犯了同样的错误。你能发布一个解决方案吗?

干杯!

吉姆Hokanson

@Jury

关于这个问题,请发邮件给我。

陪审团

这就跟你问声好!

我尝试读取TDMS文件,在Matlab R2013a中创建LV2012 (12.0.1f2), 64bit,得到错误:

使用TDMS_processLeadIn错误(第50行)
目前代码无法忽略/处理原始Daq MX数据

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

对于读取TDMS文件有什么建议吗?

陪审团

吉姆Hokanson

@Cole ? ?-什么解决办法?请通过电子邮件与我联系,讨论细节。

谢谢,
吉姆

科尔·范·弗拉克

我还应该提一下,我确实尝试过你之前给出的解决方案。当我使用它时,我得到以下错误,

---------
TDMS_processLeadIn中的错误(第27行)
Ttag = fread(fid,1,'uint8');

输出参数“eof_error”(可能还有其他)在调用“E:\Data\Cobra Integration”时未分配
测试\ v2p5 \ tdmsSubfunctions \ TDMS_processLeadIn.m > TDMS_processLeadIn”。

TDMS_preprocessFile中的错误(第179行)
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

测试中的错误(第4行)
my_tdms_struct = TDMS_getStruct(文件名);

塔尔·

在Matlab 2010上工作得很好,现在尝试使用Matlab 2008。

得到这个错误:
“? ?错误:文件:TDMS_readTDMSFile。m线:134
列:3
表达或陈述是不正确的——有可能
不平衡(,{,或[。"

我怎么解决这个问题?

吉姆Hokanson

仙露,

请将tdmsSubfunctions目录添加到您的路径中。

吉姆

仙露

当我试图读取tdms文件时,我得到以下错误:

???未定义的函数或方法'TDMS_handleGetDataOption'用于输入
struct类型的参数。

错误==> TDMS_readTDMSFile在216
TDMS_handleGetDataOption(“检查”,paramsStruct)

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

我怎么解决这个问题?
谢谢!

罗伯特。

我试图使用文件转换tdms文件,但我有以下错误:

使用TDMS_preprocessFile错误(第450行)
剩余的数据不会被分割成块,估计块的数量:8.181818e-01

TDMS_readTDMSFile错误(第226行)
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

有人能帮我解决一下吗?
谢谢

乔Cuschieri

我正在使用您发布在MATLAB Central上的算法从TDMS文件中读取数据,但是我得到了一个错误,我不太明白为什么。

这是我的代码的一部分:
getStruct = struct;
getStruct。Group = {'6120'};
getStruct。channel = {'Untitled 3'};
getStruct。指数= [2 3];
tempOutput4 = TDMS_readTDMSFile(fname,' get_indexes ',getStruct,'SUBSET_IS_LENGTH',false)

然而,我得到这些错误:
使用cell/ismember>cellismemberlegacy错误(第132行)
类cell的输入A和类cell的输入B必须是字符串的单元格数组,
除非一个是字符串。

cell/ismember错误(第76行)
[varargout{1:nlhs}] = cellismemberlegacy(varargin{:});

TDMS_handleGetDataOption错误(第167行)
[~,loc] = ismember(objPaths_getIndex,objectPaths);

TDMS_readTDMSFile错误(第228行)
optionStruct = TDMS_handleGetDataOption(' getray ',paramsStruct,metaStruct);%的选择
处理

Test1中的错误(第21行)
tempOutput4 =
getStruct TDMS_readTDMSFile(帧,‘GET_INDICES’,‘SUBSET_IS_LENGTH’,假)

我使用的是MATLAB R2012b。

有什么建议吗?

吉姆Hokanson

雷内,

TDMS不包含时间,除非显式地将其保存为通道。这通常只在周期性采样时才会做,这样事件之间的时间间隔就不是恒定的。否则,时间通常是由已知的采样率暗示的。如果您将时间保存为时间戳,我目前将时间戳数组返回为Matlab时间格式的数字向量,而不是将每个元素转换为字符串(如datestr)。这使得计算时间变得更容易(注意,这个向量中1的差值表示1天的差值,除以86400得到秒)。如果您还有问题,请通过电子邮件与我联系。

吉姆

刘若英

吉姆,

非常喜欢你的作品。这将节省大量磁盘空间,因为不再需要将其保存为lvm。

输出格式非常简单,但是我不知道哪个变量包含有采样时间的数组。
我认为tdms文件必须保存时间,因为excel可以从那里抓取它。

请问样本时间是否也导入到了matlab中?

最好的问候,
刘若英

吉姆Hokanson

嗨,安东尼,

是的,这个问题解决了。我倾向于离线发送邮件。

这是我发给凯文的邮件。如果你还需要什么,请告诉我:

电邮给kevin:
给你数据的人很可能没有正确地关闭文件。此外,他们写文件的效率非常低。

一般来说,每次写入文件时都会创建一个额外的索引头。在一个文件中写入100k个值比写入1个值更有效,100k次,100k个头。在这种情况下,NAV信息被写在一个样本中,然后TANDEM被写在200个样本中。将这些文件写入内存中的某个队列,然后偶尔将它们转储到文件中会更有效。

也就是说,你可以读取你的文件的一部分,如果你改变以下:
假设你没有在阅读:
- TDMS_readFileHelper_v1 -注释掉第187行附近的if eofPosition ~= ftell(fid)
—在TDMS_processLeadIn -第34行左右,注释掉错误并添加以下内容:
Flags = [];
Info = [];
返回
—在TDMS_preprocessFile -大约180行,写以下内容:
如果isempty(旗帜)
nSegs = nSegs - 1;
打破
结束

从本质上讲,你只是在遇到错误时停止代码,只返回到那一刻为止的内容。你文件里的内容已经很多了。我猜你只是在最后遗漏了一点数据,但我还没有费心去检查……

其他一些人也有类似的错误,但在标题中有一个标志,专门用于过早结束。这是我第一次看到标题本身像这样损坏。也许这是因为使用的是tdms文件而不是索引文件。

祝你好运,让我知道这些改变是否对你有用。

安东尼

吉姆,

有办法解决凯文的错误吗?当我运行Matlab代码时,我似乎得到了同样的错误。

伤害

@uwe:我在64bit Matlab (linux和win64)上使用过这个函数,没有任何问题。

乌维Lelke

我还可以用64位Matlab读取简单的tdm文件吗?

吉姆Hokanson

法尔汉:抱歉回复晚了。我正在为一个会议做准备,我有点急着把事情做完。我很高兴你把事情搞定了。我将为您的错误添加一个检查,以便其他人得到更明显的错误消息。谢谢!

凯文:文件大小应该不是问题。事实上,我编写的代码专门支持非常大的文件,您可以在读取更多数据之前进行部分读取和处金宝app理。请参阅我的私人信息,了解我们如何能够解决您的问题。

法尔

吉姆,
我解决了这个问题,有一些空的组名,我们的LabView代码忘记分配。我们在LabView代码中修正了这个问题,现在TDMS漂亮地转换成一个数据结构。
谢谢你!

凯文

非常感谢这项工作,这是伟大的,但我有一个问题,当我试图读取一个更大的文件:几MB工作得很好,但与80 MB的文件,我得到这个错误:

???错误使用==> TDMS_processLeadIn在33
头球意外领先

错误==> TDMS_preprocessFile在179
[flags,info,eof_error] = TDMS_processLeadIn(fid,lastLetter);

错误==> TDMS_readTDMSFile在226
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

不管怎样,它对较小的文件工作得很好。

法尔

吉姆,
我成功地在我们的TDMS的旧版本中使用了您的代码,但现在我得到一个错误。该文件是完整的,因为它可以在Excel阅读器中打开。

> > TDMS_readTDMSFile(“log_2012 - 10 - 08 - _10 - 53 - 27. - tdm的)
???对矩形空矩阵的不正确赋值。

错误==> TDMS_readTDMSFile在275
groupIndices(curGroupCount) = I_groupObject;

任何帮助都将不胜感激!

雅司病Xiaochuan

吉姆,我真的很欣赏你的工作。它帮了我一个大忙!!

马歇尔

拉里

这密码是上帝派给我的。写得很好,记录得很好,功能强大,效率高。非常感谢你为公众做的贡献,吉姆。

吉姆Hokanson

Dedric Xu最近报告说观察到一个代码问题,结果是一个bug。如果我真的认真思考,我说服自己有可能让他观察到的错误发生而没有任何明显的代码失败。我建议在可能的时候将代码更新到V2.5(一旦发布)。这个错误来自于对NI文档的过于字面化的解释。他们已经承认文件措辞不当,并表示将对其进行更新。我向受此影响的其他人道歉,尽管我真诚地希望基本上没有人受此影响。

更多细节可以在版本信息文件中找到。

虽然我目前正在做其他事情,但我仍然有以下更新:

1)将代码移植到面向对象的性质。其中包括创建更多的函数。由于考虑到函数调用开销和数据传递的速度,我没有使用这种方法,但我的决定显然使调试和更新更加困难,以及在关键瓶颈点上潜在的“可选”mex替换。
2) TDMS查看器GUI
3)支金宝app持可选地直接读取数据到双向量,而不是它被写入的格式和转换后的事实。

托比scientis

在对NL编写的代码进行了多次挫折之后,第一次尝试就完美地工作了。

吉姆Hokanson

您还需要将子函数文件夹添加到路径中。我最终想让这个类使一些方法私有和隐藏,但同时子函数文件夹只是帮助区分应该调用的函数和不应该调用的函数。

哈里帕特尔

我试图读取。tdms文件与你在readMe.txt和我得到以下错误:
>> filename = 'Digital_Input.tdms';
my_tdms_struct = TDMS_getStruct(文件名)
data = TDMS_readTDMSFile ('Digital_input.tdms')

???未定义的函数或方法'TDMS_handleGetDataOption'用于类型的输入参数
“结构”。

错误==> TDMS_readTDMSFile在213
TDMS_handleGetDataOption(“检查”,paramsStruct)

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

???未定义的函数或方法'TDMS_handleGetDataOption'用于类型的输入参数
“结构”。

错误==> TDMS_readTDMSFile在213
TDMS_handleGetDataOption(“检查”,paramsStruct)

劳拉

劳拉

非常感谢你的回复,吉姆,确实也再次提出了解决方案,工作完美!!
(我没有意识到我做了这样的改变,我的错误)
再次感谢

吉姆Hokanson

约翰:

谢谢你的宝贵意见。我在2010年底开始写这个文件,因为NI驱动程序不支持v2 TDMS文件,也因为这意味着实验室中的Mac用户要求我读取文件。金宝app我以为NI肯定会推出v2的驱动程序,但经过足够的等待,我决定创建我自己的版本。当我写完代码后,我非常惊讶地发现还有另一个版本可用。我不知道在我无数的在线搜索中我是如何错过这一点的。您提到的代码实际上有多个版本可用。我尝试的第一个版本是v2(仍然可以在网上找到),数据类型的枚举是错误的。这是一个巨大的错误,代码仍然张贴。我已经查看了其他文件,我相信v6中那些实现代码的人没有意识到在一个“头”中可以多次读取数据(因为没有更好的词)。这意味着您可能向文件写入2000个值,但只返回100个,而实际上您需要读取文件19次才能获得所有2000个样本。 Version 9 is much better although it doesn't have the same functionality that mine does, particularly the ability to read only a part of a file, or to read interleaved data. At the time of this writing I believe that is the case, obviously this may change.

我认为这里有几个关键点:
1)发布同一个文件的多个版本不是一个好主意。版本2和版本6不应该存在于文件交换中,除非可能作为一些网站的链接用于存档,或者带有“此代码不起作用”的大警告标志。
2)更重要的是,我认为这指出了在文件交换的文件之间需要更好的代码集成,无论是在共享作者身份方面还是在创建数据入口点的能力方面。想象一下,如果在Mathworks网站上,我们可以创建一个名为“文件处理器”的部分,在它下面可以有一个到TDMS(美国国家仪器公司)的链接。在那个页面上,可以有一个关于格式的简短描述,以及人们提供的各种解决方案。金宝搏官方网站总的来说,我认为文件交换是过时的和无效的。我相信曾经有人尝试编写关于文件交换的包装器,但这些都被TMW关闭了。即使现在我正在把我的新代码转移到github上,尽管它失去了与语言/程序的联系,但我觉得有人可以更好地为我的代码做出贡献,并帮助制作社区软件。

约翰F

女士们先生们,这个文件运行得很好。如果您使用的是旧版本的Matlab,则必须用我所说的“哑变量”更改两个“~”占位符,因为不能识别~。

如果有人感兴趣,有另一个TDMS转换程序称为convertTDMS (v6)。我拼命地想弄清楚为什么那个代码不能正常工作。

不幸的是,convertTDMS只能读取文件的一部分。这个工作起来就像做梦一样。

如果有人有任何想法,为什么convertTDMS只是阅读我的文件的一部分,我很乐意听到你的理论。

最好的

摩根富林明
以前的新手,现在的新手

劳拉

附注:不同类型的数据只是在处理被修改为具有双重精度的文件时才会出现问题。原来的版本是可以的,但是,对单曲

劳拉

嗨,吉姆!,

我继续使用您的TDMS转换器(真的是一个很好的工作!)在您成功地建议转换双重格式的TDMS数据之后。

然而,我发现了另一个小问题,阻止我成功转换我的新tdms文件。我一直在看,但同样,到目前为止我还没能修好它。当尝试运行转换器时,我发现以下错误:

???试图访问数据类型(10);索引越界,因为数字(dataTypes)=3。

错误==> TDMS_readFileHelper_v1在76
if any(dataTypes ~= dataTypes(10))

错误==> TDMS_readTDMSFile在249
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

事实上,我的tdms文件有两种类型的数据:DT_FLOAT,(唯一存在的第一个tdms,我正在处理),但也是最后一组数据,现在是DT_DOUBLE。

如果我的tdms文件有两种类型的数据,我该怎么办?我能用这个转换器处理吗?

无论何时你有时间回复这个请求,都非常感谢!

最好的问候,
劳拉

理查德。

非常感谢你,吉姆。

布莱恩•科尔

吉姆Hokanson

德德里克,请检查我的电子邮件。谢谢。
吉姆

Dedric徐

嗨,吉姆,
我遇到了一个令人发狂的问题。我已经尝试使用你的功能读取我的tdms文件,但是失败了。我的文件有点大,大约60MB。

当我运行你的函数时,它崩溃了。

我使用的函数是[output,metaStruct] = TDMS_getStruct(filePath,4);

程序运行了大约20分钟,然后就崩溃了。

我得到了以下错误:

警告:FOR循环索引太大。截断到2147483647。
>在TDMS_readFileHelper_v1在66
在TDMS_readTDMSFile中的249
在TDMS_getStruct中57
使用TDMS_readFileHelper_v1错误(第184行)
检测到灾难性错误,代码可能在某个地方有错误

TDMS_readTDMSFile中的错误(第249行)
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

TDMS_getStruct中的错误(第57行)
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

是Matlab版本的问题还是我遗漏了什么?

最好的问候,
Dedric

迈克尔·龚

劳拉

劳拉

它工作得很完美!谢谢a lot for the program and for the fast help!
这真的是我在网上找到的tdms转换最好的工作

吉姆Hokanson

劳拉,你指出了一个我认为应该解决的问题,但我还没有触及到。一般来说,我发现尊重数据类型是很好的,这样可以防止用户的内存溢出,但显然有时您希望以双精度读入数据。

我最终想要更优雅地处理这个问题,但你可以尝试下面的方法来让事情正常工作:
1)在TDMS_initData中,从0中删除字符串规范,在你的情况下,它听起来像你想要case{9 25}是:
输出= 0 (1,nSamples,'single')而不是输出= 0 (1,nSamples,'single')
2)在TDMS_getTypeSeekSizes中将读取规范改为“type”而不是“type=>type”,在你的情况下,你想要的是“single”而不是“single=>single”

这两个更改将使所有双精度表都被读作单精度表。我最终想做一个干净的解决方案,但我最近太忙了。

劳拉

这是一些时间,我玩你的套路。这是一部奇妙的作品。然而,尽管可以很好地将复杂的.tdms文件转换到matlab,但我没有成功地修改转换值的精度。我猜是在readOptions中指定的(与默认值不同),并且在子例程TDMS_getTypeSeekSizes和TDMS_readFileHelper_v1中特别调用。我不是一个高级matlab用户。如果你能帮我更改这些设置,我将非常感激。
我的问题在于,我想有记录结构化数据的双精度,而不是单精度。
谢谢你的工作和关注

LV

Sergiy

约翰Vazey

就会得到一个错误
???错误使用==> TDMS_readFileHelper_v1在188
检测到灾难性错误,代码可能在某个地方有错误

还有人有这个问题吗?

合资企业

布莱恩

我是TDMS文件的新手,我只是假设它们都可以读取相同的内容。我的测试文件只是我从NI下载的一个示例文件。我不知道Raw DAQ MX不同于任何其他TDMS文件。

吉姆Hokanson

关于文档方面的改进,这可能是需要改进的一个方面。原始的DAQ MX数据是一种专有的Labview格式,我曾被拒绝获得这种类型的规格。我已经设法解析了几个例子,但由于我有这么少的例子,我还没有尝试实现它。在我的经验中,原始格式实际上只是作为一个普通的数据类型(在我的经验中是int16 ??)读取,具有指定如何将原始数据缩放为测量数据的属性。我不知道如何从元信息中提取真实的数据类型。从技术上讲,我可以把它当作一些数据类型,比如uint8,但要解析数据通常(不总是)依赖于知道数据类型的大小。此外,还有一些奇怪的元信息缓冲,我可以手动硬编码,但我不确定它是否总是存在。

也就是说,如果你有一个示例文件,我会有兴趣看看它,这样我最终可以提供一些变通办法。正如我所说,我在提取数据时运气不错。

布莱恩

我试图打开我的大数据文件:

[tmp,metaStruct] = TDMS_readTDMSfile('C:\Users\bjmarti4.NDC\Desktop\FIRST_LIGHT_CO2.tdms','GET_DATA_OPTION','getnone')

我得到以下错误:

???错误使用==> TDMS_processLeadIn在50
目前代码无法忽略/处理原始Daq MX数据

错误==> TDMS_preprocessFile在179
[flags,info] = TDMS_processLeadIn(fid,lastLetter);

错误==> TDMS_readTDMSFile在223
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

在==> tdms_examplefunctions95调用错误
(tmp metaStruct] =
TDMS_readTDMSfile(“C: \用户桌面\ \ bjmarti4.NDC \ FIRST_LIGHT_CO2.tdms’,‘GET_DATA_OPTION’,‘getnone’)

我可以打开一个小的测试文件,但是当我试图打开我的数据文件时,我就会得到错误

吉姆Hokanson

您可以按照自己的意愿详细地读取数据。请参阅文档文件TDMS_retrievingSubsets。在读取数据时,您可以获得您想要的任何细粒度,如果您愿意,可以指定通道和样本号。如果你认为文件中有什么需要澄清的,请让我知道。

仔细检查一下,我发现我在与meta_struct相关的文档中犯了一个错误。我将很快更新。

主要的错误是后续调用是,如果你读取更多的数据,并希望使用来自前一个调用的metaStruct来减少解析时间,你仍然需要再次传入文件名:

TDMS_readTDMSfile(文件名,“META_STRUCT”、metaStruct等)

我倾向于建议使用TDMS_getStruct,在这种情况下,您将使用:

TDMS_getStruct(文件名,versionNumber,{'META_STRUCT' metaStruct etc})

布莱恩

您的代码是否可以只读取大(~3.5 GB) TDMS文件的部分?我希望每次只处理一部分数据。如果是,我该怎么做?

吉姆Hokanson

安德里亚斯,我现在还没发现代码中有任何错误。请查看我发给你的信息。

安德烈亚斯

该代码与Matlab 7.11工作吗?

我在32位(XP)和64位(Windows7)系统上用各种TDM/TDMS文件尝试过。
根据输入文件的类型,我得到2个不同的错误消息。对于NI的本地示例文件,反应是:

>> my_tdms_struct = TDMS_getStruct(filePath);
???错误使用==> TDMS_processLeadIn在33
头球意外领先

错误==> TDMS_preprocessFile在179
[flags,info] = TDMS_processLeadIn(fid,lastLetter);

错误==> TDMS_readTDMSFile在223
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

我自己生成的TDMS文件(阅读NI冠冕和Excel导入器没有问题)给出

???下标赋值维度不匹配。

错误==> TDMS_preprocessFile在456
rawDataInfo(curIndex).dataMatrix(indices,2) =…

错误==> TDMS_readTDMSFile在223
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

是Matlab版本的问题还是我遗漏了什么?

最好的问候,
安德烈亚斯
[我是一个不同于之前在这里发帖的安德烈亚斯..]

吉姆Hokanson

你好安德烈亚斯,

我已经知道这个bug有一段时间了,只是还没有上传修复程序。我一直有点慢,因为我想纳入一些其他的变化,这是一个错误,将抛出反对失败的沉默和假装工作。我很快就会上传一个修改,但现在你只需要在TDMS_readFileHelper_v1中替换以下特定的大小写结构(从第100行开始):
数据类型->更改为->数据类型(1)

吉姆

安德烈亚斯

嗨,吉姆,

看起来你的脚本完全符合我的需要。但是当我今天尝试使用它时,我的tdms文件出现了以下错误:

> >测试= TDMS_readTDMSFile(“test.tdms”)

???未定义函数或变量“dataType”。

错误==> TDMS_readFileHelper_v1 at 106
temp = fread(fid,numValuesRead*nChans,precisionType{dataType});

错误==> TDMS_readTDMSFile在258
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);

读取索引文件工作正常,我得到以下结果:

> >测试= TDMS_readTDMSFile(“test.tdms_index”)

测试=
rootIndex: 1
groupIndices: 2
groupNames:{'模拟输入'}
chanIndices: {[3 4 5 6 7]}
chanNames: {{1x5 cell}}
数据:{[][][][][][][]}
propNames: {{1x1 cell} {1x0 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell}}
propValues: {{1x1 cell} {1x0 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell} {1x1 cell}
objectPathsOrig : {'/' '/' 模拟输入“/模拟输入“/”T”“/”模拟输入“/”U“/模拟输入”/“我”“/”模拟输入' / ' B”“/”模拟输入/ H”}
numberDataPointsRaw: [0 0 28000 28000 28000 28000 28000 28000 28000]
dataType: [0 0 10 10 10 10 10 10]
dataTypeName: {'void' 'void' 'double' 'double' 'double' 'double' 'double' 'double'}

也许你有一个提示,我必须在脚本中更改什么来读取我的tdms文件?

先谢谢你。

致以最亲切的问候

安德烈亚斯

吉姆Hokanson

这应该不是问题。原始格式目前不受支持,因为它的类型未指定。金宝app

干得好,谢谢。
当我试图读取由NI-DAQmx . net tdmslologging函数直接创建的TDMS文件时,我得到一个错误。错误堆栈是:

???错误使用==> TDMS_processLeadIn在50
目前代码无法忽略/处理原始Daq MX数据
错误==> TDMS_preprocessFile在175
[flags,info] = TDMS_processLeadIn(fid,lastLetter);
错误==> TDMS_readTDMSFile在225
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);
错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

目前似乎不支持“原始DAQmx数据”。金宝app这太糟糕了,因为只需几行代码就可以在MATLAB中创建数据记录器(只安装NI-DAQmx和基本MATLAB)。我会把这个分享给任何感兴趣的人。

是否有机会进行支持此数据类型的更新?金宝app
杰夫

吉姆Hokanson

Craig发现了2.2版中出现的第二个错误。此错误影响所有以前的版本。带有“/”字符的组名当前解析错误。即将发布的v2.2更新将解决这个错误,以及get子集,ignore子集错误。注意:这两个bug都会导致错误,而不是无声地失败。谢谢大家让我知道你有一个问题,所以我可以改进代码。

吉姆

克雷格•史密斯

吉姆,请忽略我之前的评论。我已经解决了(愚蠢的用户错误)。我现在得到以下错误:
my_tdms_struct = TDMS_getStruct(文件名);
???在赋值A(I) = B中,B和中的元素数量
我一定也一样。

错误==> TDMS_readTDMSFile在255
groupIndices(curGroupCount) = I_groupObject;

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

curGroupCount的值为1,但I_groupObject是一个长度为14的数组,取值范围为2到15。不知道为什么不匹配

克雷格•史密斯

吉姆,我刚刚下载了你的文件,并试图从你的readMe.txt文件开始读取TDMS文件v2。当我运行TDMS_getStruct(文件名)并选择我的文件时,我得到以下错误消息:
???未定义函数或方法'TDMS_handleGetDataOption'用于类型为'struct'的输入参数。

错误==> TDMS_readTDMSFile在192
TDMS_handleGetDataOption(“检查”,paramsStruct)

错误==> TDMS_getStruct在57
[temp,metaStruct] = TDMS_readTDMSFile(filePath,readOptions{:});

你知道我该怎么做吗?

吉姆Hokanson

发现v2.2中影响使用值为' get子集'或' ignore子集'的GET_DATA_OPTION的错误
这个错误已经抛出一个错误,让您知道读取不正确

如果你得到错误:
请求值的#不等于返回值的#,代码中可能出现错误
然后通过添加这一行来解决这个问题:
numValuesToGetActual(~keepDataArray) = 0;

在这几行之后:(大约第133行)
useSubset = false;
subsetInfo = struct([]);
numValuesToGetActual = metaStruct.numberDataPoints;

这将在下一个版本中修复。

吉姆Hokanson

嗯,

总的来说,代码看起来很好。我会把已经解析过的元结构扔回函数调用中,以节省处理时间。稍后我会给你一些说明。正如代码所述,当出现这样的问题时,很可能是我的错。一般来说,我尽量在可能的情况下检查,因为我宁愿事情不好,然后告诉你,而不是假装工作。我会给你发一封电子邮件,详细说明我们如何找到解决这个问题的方法。

吉姆

Juha Suomalainen

你好,
你这里有很好的代码,但我认为里面仍然有一个bug。我能够加载我的整个TDMS文件使用你的功能。这很好。不幸的是,我的一些数据集将是巨大的,由于内存问题必须加载和处理的部分。如果我试图使用您的函数读取数据的子集,我会得到一个错误。

下面是逐组读取和处理数据的代码:
---
获取TDMS内的内容列表
params = {'GET_DATA_OPTION','getnone'};
TDMS_Structure = TDMS_readTDMSFile(TDMS_File, params{:});
从TDMS文件中逐个读取和处理组
for GroupNumber = 1: nummel (TDMS_Structure.groupNames)
Params ={…
“GET_DATA_OPTION”、“getSubset’,……
“OBJECTS_GET”、结构(“groupsKeep”,{{TDMS_Structure.groupNames {GroupNumber}}})};
TempData = TDMS_readTDMSFile(TDMS_File, params{:});
%处理数据子集
ProcessData (TempData)
结束
---

我可以读取TDMS_Structure没有问题,但'TDMS_readTDMSFile'的子集加载调用产生一个错误:

---
???使用==> TDMS_readFileHelper_v1在211错误
请求值的#不等于返回值的#,代码中可能出现错误

错误==> TDMS_readTDMSFile在229
data = TDMS_readFileHelper_v1(fid,optionStruct,metaStruct,paramsStruct);
---

这是一个错误,还是我只是用错误的参数你的代码?

吉姆Hokanson

嗨,菲奥娜,

谢谢你指出这个问题。本周初我真的很忙,但我可能会在周四或周五处理这个问题。详情请参阅我的电子邮件。

吉姆

霏欧纳

感谢上传!
当我试图读取我的TDMS文件时,我得到了下面的错误。不知道有没有人能帮上忙。谢谢!

???在375中使用==> TDMS_preprocessFile错误
剩余的数据没有被分割成块,估计块数量:5.000000e-001

错误==> TDMS_readTDMSFile在198
metaStruct = TDMS_preprocessFile(fid,tdmsFileName,paramsStruct);

错误在==>测试在11
[finalOutput,metaStruct] = TDMS_readTDMSFile(tdmsFileName)

吉姆Hokanson

是的。我在64位Windows上使用它,在64位Mac上进行了测试。

凯文

请告知这是否适用于64位matlab

吉姆Hokanson

@Guosong张
在2009b中引入~作为忽略输出的一种方式。如果输出需要大量内存,这可能特别有用。尽管我意识到不是每个人都在使用2009b或更高的版本,但我已经养成了使用它们的习惯。我可能会上传一个修复程序,其中我放回了虚拟变量,尽管我更倾向于写一个小脚本,允许检查版本,并在需要时替换所有文件。

Guosong张

???错误:文件:TDMS_readTDMSFile。m行:453列:11
表达式或语句不正确——可能不平衡(、{或[。

伤害

工作好了!带有dll的NI工具在我身上失败了(64位版本似乎不起作用,32位版本还可以)。
但这个更好;我认为它在Linux系统上也能运行。

伤害

爱德华Zechmann

吉姆Hokanson

Joacim,

我修复了统一码错误。1.1版应该很快就会发布。我误读了一些关于#字节vs #字符的文档。谢谢你指出我的错误。

吉姆

吉姆Hokanson

你好,

针对Joacim的评论:

1)文件大小应该没有限制(除了用户的内存大小),内存不足表示解析错误。

2)我仍然不确定代码处理unicode的效果如何。该错误似乎表明正确解析字符串的能力…

3)如果任何人看到类似的错误,请随时通过电子邮件给我一个示例文件,我很乐意尝试和修复代码,以便它得到处理。

谢谢,
吉姆

Joacim

你在这上面花了不少功夫。干得好,文件记录得很好。
测试了我的信号快车2009保存的数据功能。适用于小文件(<6 MB),但当试图加载较大的文件(>50 MB)它崩溃。
我很懒,所以我从NI下载了matlab_tdm_example_sp2010.zip。使用nilibddc.dll和approximate .dll。200行代码,包括注释,我在不到4秒的时间内读取了更大的文件(大约320 MB)。

下面是这次事故的一些信息。也许它能帮你解决问题:

testTDMSreading
266 propName = fread(fid,propNameLength,'*char')';
???使用==>读取错误
内存不足。键入HELP MEMORY作为选项。

错误==> TDMS_preprocessFile在266
propName = fread(fid,propNameLength,'*char')';

错误==> TDMS_readTDMSFile at 176
[rawDataInfo, numberDataPoints objectPaths segInfo] =
TDMS_preprocessFile (fid2 isIndexFID2 params);

错误==> testTDMSreading在34
output = TDMS_readTDMSFile(fullfileName,optionCA{:});

> > testTDMSreading
266 propName = fread(fid,propNameLength,'*char')';
K > > propNameLength
propNameLength =
1.9629 e + 009
K > >支撑材
fid =
12
K > > curProps
curProps =
第1至第8列
格式字符串的unit_string[1将字符]” ' [] [] [] [] []
第9至20栏
[] [] [] [] [] [] [] [] [] [] [] []
K > > iProp
iProp =
4
K > > propNameLength
propNameLength =
1.9629 e + 009

MATLAB版本兼容性
使用R2010a创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!