Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我想从文本文件加载变量。
例如,我的文本文件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] 基本上,我尝试针对一个非常大的问题( 旅行商问题 (TSP)类型)改编遗传算法 (GA)。问题是我拥有的每个变量都是一个矩阵,并且交叉,适应性和突变代码变得非常复杂。而且我也遇到了随机分配初始种群的问题。 我想从256个列表中随机选择30个变量,这样该变量只能被选择一次。但是,每个变量在无法更改的2 * 2矩阵中都有自己的特定值。 我想使用randperm,然后在每个使它们成为变量而不是值的值前加上一个x 。 回答: 如果文本文件中的数据如下所示(字符串用空格分隔): x1 x2 x3 ... 您可以使用TEXTSCAN将字符串读取到单元格数组中, 如下所示: fid = fopen('file.txt','r'); A = textscan(fid,'%s'); fclose(fid); A = A{:}; A现在将字符串存储在单元格数组中: {'x1'; 'x2'; 'x3'; ...} 。现在,要使用这些字符串之一创建变量并为其分配值,我将使用ASSIGNIN : assignin('base',A{1},[1 2; 1 2]); 这将在基本工作区中创建一个变量x1并为其分配值[1 2; 1 2] 。第一个参数可以是'base'或'caller',以在MATLAB基础工作空间或调用函数的工作空间中创建变量。您将对A中的每个字符串名称重复此操作,并为其提供所需的任何值。 替代选项: 这是我上面给你的答案的替代答案。上面的答案解决了您在问题中提出的特定问题。 该答案为您提供了另一种选择,可避免您在问题中描述问题的方式,从而希望使事情变得更容易... 如果我了解您的问题,则基本上有256个2×2矩阵,并且您想随机选择30个。这些2×2矩阵的每个听起来都像是存储在其自己的变量( x1至x256 )中。相反,我建议将所有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个值,则可以使用RANDPERM来随机化3-D数组的三维维度或单元格数组的顺序 : 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 然后,只需使用xArray中的前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,以继续生成新的矩阵随机数组。如果必须跟踪所使用的原始矩阵,则必须在对xArray进行随机化之后添加以下行: startOrder = startOrder(index); 现在, startOrder的条目将告诉您矩阵所处的原始位置。例如,如果startOrder中的第一个数组条目为40,则xArray的第一个位置中的矩阵最初是您在初始化xArray时输入的第40个矩阵。 希望这可以帮助! 更多&回答... |
![]() |
![]() |