gpt4 book ai didi

matlab - 如何找到某个结构在 Matlab 中完成的命令?

转载 作者:行者123 更新时间:2023-12-02 05:07:56 25 4
gpt4 key购买 nike

假设 a 被定义为下面的结构。我试图找到与 R 的输出等效的命令,但错误 here .例如,我知道下面的格式必须是 struct('const',1,'terms',{{struct(),struct()}}) 但我不知道什么存储在结构中而不用像 here 这样的命令来检查它, 耗时。

那么通过哪个命令我可以看到在 Matlab 中生成结构的原始命令?

>> a

a =

const: 1
terms: {[1x1 struct] [1x1 struct]}

最佳答案

评论

Is it possible for you to switch from using a structure to a class? If so you could make one that mimics the struct, and each time it is modified call stack = dbstack to get the stack - then store the stack along with the change. The command that made the change could then be retrieved automatically later from the line numbers in the stack.

作为评论中对此的后续请求,这里是一个提供结构功能并保留其分配记录的类的示例:

classdef utstruct
properties (SetAccess = private)
modifications
end

properties (Dependent, SetAccess = private)
myStruct
end

properties (Access = private)
m_struct
end

methods
function self = utstruct(varargin)
if nargin > 0
self.m_struct = builtin('struct', varargin{:});
else
self.m_struct = builtin('struct');
end
% Should update self.modifications here
end

function B = subsref(self, s)
if any(strcmp(s(1).subs, properties(self)))
B = builtin('subsref', self, s);
else
B = subsref(self.m_struct, s);
end
end

function A = subsasgn(self, s, b)
self.m_struct = subsasgn(self.m_struct, s, b);

newMod = builtin('struct');
newMod.type = 'subsasgn';
newMod.modData = {s b};
newMod.stack = dbstack;
self.modifications = [self.modifications; newMod];

A = self;
end

function disp(self)
disp(self.m_struct);
end

function names = fieldnames(self, varargin)
names = fieldnames(self.m_struct, varargin{:});
end

function C = cat(self, dim, varargin)
uts = cellfun(@(x)isa(x, 'utstruct'), varargin);
varargin{uts} = cellfun(@(x)x.m_struct, varargin(uts));
varargin = [{self.m_struct} varargin];
self.m_struct = cat(dim, varargin{:});

% Should update self.modifications here

C = self;
end

function C = horzcat(self, varargin)
C = self.cat(1, varargin{:});
end

function C = vertcat(self, varargin)
C = self.cat(2, varargin{:});
end

function value = get.myStruct(self)
value = self.m_struct;
end
end
end

你应该添加一些代码来在初始化/连接操作发生时更新修改数组。

subsrefsubsasgn 覆盖是这里的关键点,它们使它的行为像一个结构(通过将它们的所有事件推迟到实际结构),但其他覆盖如fieldnamesdisp 做同样的事情。在 subsasgn 中,保存了对结构的所有赋值的记录,以及生成赋值的堆栈。

注意:要使其与内置的struct 完全兼容,您可能应该覆盖更多的方法,但这应该足以让您入门。参见 Subclassing MATLAB Built-In Types .

编辑:我使该示例更加健壮。它现在是一个值类 - 它应该是 - 并且可以连接。

编辑:通过重新定义函数 struct,您可以避免使用查找和替换来重构现有的 struct(...) 调用>:

function s = struct(varargin)
% STRUCT Overrides default struct function to provide unit-testable structs
%
% Set global variable unitTestStructEnabled to true to enable this
% function.
%
global unitTestStructEnabled;

if isempty(unitTestStructEnabled)
unitTestStructEnabled = false;
end

if unitTestStructEnabled
s = utstruct(varargin{:});
else
s = builtin('struct', varargin{:});
end

你可能不希望它一直在你的路径上徘徊,因为当你第一次创建一个结构时你会收到警告(你可以关闭它,但这可能会隐藏其他问题),所以你应该放到一个平时不在路径下的文件夹里,临时加到单元测试的路径下(addpath/rmpath)。

关于matlab - 如何找到某个结构在 Matlab 中完成的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com