Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 从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] 基本上,我尝试针对一个非常大的问题( 旅行商问题 (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矩阵的每个听起来都像是存储在其自己的变量( x1x256 )中。相反,我建议将所有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个矩阵。

希望这可以帮助!



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 19:49


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.