我想从文本文件加载变量。
例如,我的文本文件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个矩阵。
希望这可以帮助!
更多&回答...