मुझे एक MATLAB स्क्रिप्ट पोर्ट करने की आवश्यकता है, जो csvread() के साथ कॉन्फ़िगरेशन और डेटा को C++ में पढ़ने और लिखने के लिए .csvs का उपयोग करती है।

स्पष्ट विकल्प MATLAB में कोडर ऐप का उपयोग करना था लेकिन csvread() कोडर द्वारा समर्थित नहीं है।

रूपांतरण को आगे बढ़ाने के लिए कार्रवाई का सबसे अच्छा तरीका क्या होगा?

मैंने MATLAB में फ़ाइल को पार्स करने के लिए fileread() या fread() के माध्यम से फ़ाइल को पढ़ने का प्रयास किया लेकिन textscan() जैसे फ़ंक्शन कोडर द्वारा समर्थित नहीं हैं।

ऐसा भी लगता है कि coder.ceval() सरणी वापस नहीं कर सकता - कम से कम मैनुअल ऐसा कहता है - एक पार्सर को सी ++ में कैसा दिखना होगा? मैं एक नेस्टेड वेक्टर लौटने की योजना बना रहा था।

1
kamikatze13 21 जिंदा 2020, 23:56

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप कोडर का उपयोग करने के लिए तैयार हैं, तो एक बार फ़ाइल पढ़ने के बाद, आप पार्सिंग करने के लिए MATLAB फ़ंक्शन strtok और coder.ceval कॉल को C sscanf के संयोजन का उपयोग कर सकते हैं। मेरा जवाब यहां CSV डेटा को पार्स करने के लिए ऐसा करने का एक उदाहरण दिखाता है।

डेटा

1, 221.34
2, 125.36
3, 98.27

कोड

function [idx, temp, outStr] = readCsv(fname)
% Example of reading in 8-bit ASCII data in a CSV file with FREAD and
% parsing it to extract the contained fields.
NULL = char(0);
f = fopen(fname, 'r');
N = 3;
fileString = fread(f, [1, Inf], '*char'); % or fileread
outStr = fileString;
% Allocate storage for the outputs
idx = coder.nullcopy(zeros(1,N,'int32'));
temp = coder.nullcopy(zeros(1,N));
k = 1;
while ~isempty(fileString)
    % Tokenize the string on comma and newline reading an
    % index value followed by a temperature value
    dlm = [',', char(10)];
    [idxStr,fileString] = strtok(fileString, dlm);
    fprintf('Parsed index: %s\n', idxStr);
    [tempStr,fileString] = strtok(fileString, dlm);
    fprintf('Parsed temp: %s\n', tempStr);
    % Convert the numeric strings to numbers
    if coder.target('MATLAB')
        % Parse the numbers using sscanf
        idx(k) = sscanf(idxStr, '%d');
        temp(k) = sscanf(tempStr, '%f');
    else
        % Call C sscanf instead.  Note the '%lf' to read a double.
        coder.ceval('sscanf', [idxStr, NULL], ['%d', NULL], coder.wref(idx(k)));
        coder.ceval('sscanf', [tempStr, NULL], ['%lf', NULL], coder.wref(temp(k)));
    end
    k = k + 1;
end
fclose(f);
1
Ryan Livingston 22 जिंदा 2020, 12:05