2015-01-06 98 views
0

我以前编写过一些代码来将3列分成4列,但代码效率很低且耗时。由于我正在处理数百万行,因此不合适。 (下面是我以前的代码)Matlab - 将列分成两部分(高效)

tline = fgetl(fid); 

ID=tline(1:4); 
IDN = str2double(ID); 

Day=tline(6:8); 
DayN = str2double(Day); 

HalfHour=tline(9:10); 
HalfHourN = str2double(HalfHour); 

Usage=tline(12:end); 
UsageN = str2double(Usage); 

必须有这样做的更有效和更快的方法?

回到基础,我已经产生了x乘以3的矩阵。但4矩阵需要一个X

为了证明什么,我试图做的,考察一个行 - 我试图改变

1001 36501 1005 

1001 365 01 1005 

任何帮助将是非常不胜感激!

编辑:

我想分成两个第二列,总是由5个字符。我试图将前3个字符放到自己的列中,对于其余字符也是如此。

+0

你编辑CSV/TXT文件?如果是这样,请使用[Notepad ++](http://notepad-plus-plus.org/)。将光标放在“1001 365”后面的第一行,然后选择“编辑” - >“列编辑器” - >“文本插入”以插入空白列。 – Thomas

+0

一般而言,将数字转换为字符串会使事情减慢很多。 –

+0

托马斯提出了很好的建议,但由于某种原因,这些列不再在第100行左右进行分布。 – HarryL0

回答

0

可以使用模

ANS =(36501 - MOD(36501,100))/ 100 如果你想1这会给你365

,它是MOD(36501,100)

所以这将有效地将第二列分成2个不同的数字,那么你可以重新命名它们等

转念一想

嗯,如果你的第二列所有的数字是5位数字,这可能是极其有效,因为mod是计算的在matlab中由b = a - m。* floor(a./m);

检查http://uk.mathworks.com/help/matlab/ref/mod.html它应该工作的载体(即你的第二列)

+0

那么,它看起来像你在加载一个很长的数字,你想把它分成4列较小的数字。这可以使用modulo(只需更改100到10000等)并重命名它们中的每一个。我不确定你的输入数据是什么样的。模数是将整数数据分解成较小部分的最有效方式。 – GameOfThrows

+0

我已经实现了该功能,但计算机正在努力实现代码。 T = importdata('File1。文本'); A = T(:,[1]); BA = T(:,[2]); BB = T(:,[2]); B =(BA-mod(BA,100))/ 100; C = mod(BA,100); D = T(:,[3]); Combined = [A,B,C,D]; dlmwrite('1',Combined); 想法? – HarryL0

1

你的情况可能需要一些时间实际上是使用str2double函数。众所周知,当数据集很大时,这个内置函数变得非常慢。如果可能的话,你可以尝试摆脱它。