2013-12-20 55 views
1

我有一個很長的字符串,我想找到所有的NaN值並將其替換爲'Null'。這個長的字符串是從一個120×150000的單元轉換而來的。將它轉換爲長字符串的原因是我將它轉換爲一個巨大的SQL查詢,因爲fastinsert和datainsert可能會很慢,有時我的堆空間不足。這個想法是做下面的事情用Matlab中的一個非常長的字符串Null替換NaN

exec(sqlConnection, long_string) 

我試過使用regexpreop用null替換NaN,但它似乎很慢。有沒有其他的方法。

long_string = regexprep(long_string,'NaN','null'); 
+0

是否有在與字符串分隔符任何你肯定'NaN'總是你想要什麼更換? – Floris

回答

2

regex非常強大,但由於其靈活性可能會變慢。如果您仍然有原始細胞陣列 - 假設它只包含字符串 - 下面的代碼行應該工作,而且速度非常快:

cellArray{find(ismember(cellArray,'NaN'))} = 'null'; 

ismember發現所有元素cellArrayNaN,返回一個布爾數組具有與cellArray相同的形狀; find操作將它們轉換爲NaN元素的索引,然後您只需將值null分配給它們中的所有元素。

必須說120 x 150,000是一個非常大的單元陣列 - 即使每個單元中只有一個字符,它也會佔用2 GB以上(我知道這是因爲我剛剛創建了一個120x15000單元陣列,它是205,500,000字節)。這可能是值得處理的小塊,而不是一次。特別是如果您知道NaN只會出現在某些列中,例如。

處理GB大小的字符串,尤其是當您無法就地操作時(您正在更換每個替換字符串的大小,並且它變得更長,而不是更短),將會變得緩慢。如果你真的沒有別的選擇,那麼你可以寫一個簡短的mex函數來做到這一點 - 這可能會非常快。

+0

其實它有字符串和數字。我想我會把細胞分成更小的塊,然後處理。 – cloudviz

5

由於弗洛里斯提到regexp是一個非常強大的命令,因此比其他查找命令慢。

除了弗洛里斯的建議,你可以嘗試使用strrep它適用於你的情況,因爲你沒有使用regexp的任何特殊權力。

下面是一個例子:

str = char('A' + rand(1,120 * 15000)*('z'-'A')); 

tic 
str2 = strrep(str, 'g', 'null'); 
disp('strrep: '), toc 

tic 
str3 = regexprep(str, 'g','null'); 
disp('regexprep: '), toc 

在我的電腦,則回覆:

strrep: 
Elapsed time is 0.004640 seconds. 
regexprep: 
Elapsed time is 4.004671 seconds. 
+2

三件事情的+1:'strrep'的建議,時間示例,以及生成隨機字符串的絕妙方式!時間隨着字符串長度的變化而變化,看起來......(更長時間走得更快 - 走到數字)。 – Floris

+0

感謝你們倆。真正有用的東西。 – cloudviz

+1

@弗洛里斯:謝謝! @ user1796228:您也可以考慮在分割數據時使用並行計算(例如'parfor')。 – pm89

相關問題