2016-09-30 86 views
-1

我有一個excel列,包含4或5個字符的字符串,我想將它們轉換爲數字。因此,不要「關閉」,我希望單元格包含「5」。而不是一個「打開」我想要的細胞含有「4」如何將存儲在單元格數組中的字符串轉換爲Matlab中的數字?

[num,txt,raw] = xlsread('test.xlsx'); 

instructionopen = find(strcmp(raw,'open'),2); 
instructionclose = find(strcmp(raw,'close'),2); 

% I will try to convert a string cell to characters and the to a number. 
open = [] 

open = [] 
open2 = [] 
for i = 1:numel(instructionopen) 
    open = [open; char(instructionopen(i))]; 
    open2 = [open2; str2num(open(i))]; 
end 

我相信我的編碼是不優雅,但我basicall努力使兩個數組,一個在那裏我將每個字符串元素一個字符然後另一個將它們轉換爲數字。轉換爲字符後的輸出給了我一個看起來像2個漢字的值(!)。我必須在那一步做點事。

我在做什麼錯,或者我怎麼能在這些單元格中實現數字而不是字符串?

編輯

燒杯建議使用地圖容器。我試過

instructions = {'open','close'}; 
valueSet = [1,2]; 
mapObj = [] 

for i = 1:numel(instructionopen) 
    if instructionopen(i) == 'open' 
     mapObj = containers.Map(instructions,valueSet) 
    end 
end 

但問題是mapObj出來空了,所以我一定在做smoething錯誤。

matlabbit建議使用字符串的長度。我試過

instructiontype = [] 
for h = 1:length(instructionindex) 
    instructiontype = [instructiontype; length(instructionindex(h))] 
end 

但它一直給我的數組元素的1的長度。我找不到函數strlength?

EDIT2 matlabbit建議使用cellfun(長度)

instructionindex = find(strcmp(raw,'Instruction: ')); %gets index of cells that have "Instruction" in them 
instructionindex2 = char(raw{instructionindex, 2}); %converts the content of the cells one column to the right (second column) to characters 
instructionindex3 = mat2cell(instructionindex2, ones(size(instructionindex2,1),1)); %converts this to a matrix of cells 
instructionindex4 = cellfun('length',instructionindex2) %finally performing the conversion to the number that represents the length of the content of each cell 

我現在得到的24個雙打矩陣,但他們都是五元(5)......然而,有些應該是四肢(4)。

如果我沒有做過mat2cell,它不會允許我執行長度函數,因爲我一直收到它們不是單元格的錯誤。也許是因爲我之前使用的字符,和我看起來像closecloseclosecloseopenopencloseopenopenopenopen ... ECT值

編輯3:張貼圖片作爲簡化的Excel文件示例

enter image description here

我管理提取條件和試驗的數字,但我需要爲「開放」和「關閉」數字。我試圖將它們轉換爲相應的字符串長度。

我也試過這樣:

instructionindex = find(strcmp(raw(:,1),'Instruction: ')); 
instructionindex1 = char(raw{instructionindex,2}); 
instructionindex2 = mat2cell(instructionindex1, ones(size(instructionindex1,1),1)); 
instructionindex3 = cellfun('length',instructionindex2); 


test = zeros(size(instructionindex2)); 
for h = 1:length(instructionindex2) 
    if strcmp(instructionindex2{h},'open') 
     test(h) = 4; 
    elseif strcmp(instructionindex2{h},'close') 
     test(h) = 5; 
    end 
end 

有趣的是這給了我數,但陣列由0的用於關閉打開和5(!)。我想現在我很好,但我真的很想知道我做錯了什麼!

enter image description here

+1

也許你正在尋找一個[圖](http://www.mathworks.com/help/matlab/ map-containers.html)容器,它可以將字符串作爲鍵映射到數字值。 – beaker

+0

你想要數字5還是文本表示「5」?另外,與5個字符的「close」有關嗎?這真的只是一個操作? – matlabbit

+0

感謝@beaker的建議。我編輯我的問題與我treid解決方案,但我仍然必須做錯錯誤.. – Spica

回答

0

鑑於

raw = {'open','close','open','close'}; 

拿到長度,16B開始,你可以這樣做:

strlength(raw) 

之前16B可以這樣做:

cellfun('length',raw) 

不完全明確你正在解決什麼,而是你可以考慮使用邏輯索引分配值:

raw(strcmp(raw,'open')) = {'some value'}; 
raw(strcmp(raw,'close')) = {pi} 
+0

謝謝@matlabbit!我有Matlab R2015a。起初它不起作用,因爲我一直收到錯誤「cellfun只適用於單元格」。所以我首先使用mat2cell將其轉換爲單元格和使用的cellfun長度。但是,我得到所有5秒!我想我現在非常非常密切!我再次編輯我的問題,再次解釋我做了什麼!我會非常感謝你的幫助,因爲我認爲我接近了最終的結果! – Spica

+0

你有可能發佈樣本數據和期望的輸出嗎?基於不適合您的代碼,我很難遵循您嘗試解決的問題。 – matlabbit

+0

對不起,@matlabbit!我附上了一些圖片,並編輯了一些新的東西,我嘗試過,現在給了我兩個字符串「open」和「close」的數字 - 不是它們的長度(這是我的意圖)。 – Spica

相關問題