![]() |
从MATLAB中的文本文件加载值
我想从文本文件加载变量。
例如,我的文本文件varA , varB和varC 。 在MATLAB中,我想给这些变量赋值,以便每个变量都是2x2矩阵。 因此,从包含上述信息的文本文件中,我将得到一个看起来像这样的矩阵: [ 1 2 3 4 5 6; 1 2 3 4 5 6] 这可能吗? 我添加了第二个示例,以使事情更加清晰。 我的文本文件text.txt看起来像这样 x1 x2 x3 在MATLAB中,我的.m文件为这些变量提供值,例如 x1 = [1 1; 1 1] x2 = [2 2; 2 2] x3 = [3 3; 3 3] 因此,当我导入文本文件时,我会得到 a = (textfile) a = [1 1 2 2 3 3 ; 1 1 2 2 3 3] 基本上,我尝试针对一个非常大的问题( [URL="http://en.wikipedia.org/wiki/Travelling_salesman_problem"]旅行商问题[/URL] (TSP)类型)改编[URL="http://en.wikipedia.org/wiki/Genetic_algorithm"]遗传算法[/URL] (GA)。问题是我拥有的每个变量都是一个矩阵,并且交叉,适应性和突变代码变得非常复杂。而且我也遇到了随机分配初始种群的问题。 我想从256个列表中随机选择30个变量,这样该变量只能被选择一次。但是,每个变量在无法更改的2 * 2矩阵中都有自己的特定值。 我想使用randperm,然后在每个使它们成为变量而不是值的值前加上一个x 。 回答: 如果文本文件中的数据如下所示(字符串用空格分隔): x1 x2 x3 ... 您可以使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/textscan.html"]TEXTSCAN[/URL]将字符串读取到单元格数组中, [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/textscan.html"]如下[/URL]所示: fid = fopen('file.txt','r'); A = textscan(fid,'%s'); fclose(fid); A = A{:}; [B]A[/B]现在将字符串存储在单元格数组中: [B]{'x1'; 'x2'; 'x3'; ...}[/B] 。现在,要使用这些字符串之一创建变量并为其分配值,我将使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/assignin.html"]ASSIGNIN[/URL] : assignin('base',A{1},[1 2; 1 2]); 这将在基本工作区中创建一个变量[B]x1[/B]并为其分配值[B][1 2; 1 2][/B] 。第一个参数可以是'base'或'caller',以在MATLAB基础工作空间或调用函数的工作空间中创建变量。您将对[B]A中的[/B]每个字符串名称重复此操作,并为其提供所需的任何值。 [B]替代选项:[/B] 这是我上面给你的答案的替代答案。上面的答案解决了您在问题中提出的特定问题。 [I]该[/I]答案为您提供了另一种选择,可避免您在问题中描述问题的方式,从而希望使事情变得更容易... 如果我了解您的问题,则基本上有256个2×2矩阵,并且您想随机选择30个。这些2×2矩阵的每个听起来都像是存储在其自己的变量( [B]x1[/B]至[B]x256[/B] )中。相反,我建议将所有256个矩阵存储在一个变量中作为3-D数组: xArray = zeros(2,2,256); % Initialize all matrices as [0 0; 0 0] xArray(:,:,1) = [1 1; 2 2]; % This enters a value for the first matrix 或单元格数组: xArray = cell(1,256); % Initializes an empty array of cells xArray{1} = [1 1; 2 2]; % Enters a value for the first matrix 您将必须首先初始化所有值。然后,如果要随机选择30个值,则可以使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/randperm.html"]RANDPERM[/URL]来随机化3-D数组的三维维度或单元格数组的[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/randperm.html"]顺序[/URL] : startOrder = 1:256; % The default order of the matrices index = randperm(256); % Randomly order the numbers 1 to 256 xArray = xArray(:,:,index); % For a 3-d array xArray = xArray(index); % For a cell array 然后,只需使用[B]xArray中[/B]的前30个条目进行计算即可(而不是像以前一样使用单个变量): x = xArray(:,:,1); % Puts the first matrix from the 3-D array in x x = xArray{1}; % Puts the first matrix from the cell array in x 您可以继续重复使用RANDPERM,以继续生成新的矩阵随机数组。如果必须跟踪所使用的原始矩阵,则必须在对[B]xArray进行[/B]随机化之后添加以下行: startOrder = startOrder(index); 现在, [B]startOrder[/B]的条目将告诉您矩阵所处的原始位置。例如,如果[B]startOrder中[/B]的第一个数组条目为40,则[B]xArray[/B]的第一个位置中的矩阵最初是您在初始化[B]xArray[/B]时输入的第40个矩阵。 希望这可以帮助! [url=https://stackoverflow.com/questions/697544]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:28。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.