Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用feval未定义函数或变量时出错';Sfun&x27;_Matlab_Simulink_Tensor_S Function - Fatal编程技术网

Matlab 使用feval未定义函数或变量时出错';Sfun&x27;

Matlab 使用feval未定义函数或变量时出错';Sfun&x27;,matlab,simulink,tensor,s-function,Matlab,Simulink,Tensor,S Function,我一直使用R,所以我对Matlab很陌生,遇到了一些疑难解答问题。我正在为张量分解方法运行一些代码(可在此处找到:)。首先,我尝试运行演示代码,该代码生成运行该方法所需的模拟数据,导致以下错误: 使用feval时出错 未定义的函数或变量“Sfun” OptStiefelGBB中的错误(第199行) [F,G]=feval(fun,X,varargin{:});out.nfe=1 tbne_demo>tbne_fun中出错(第124行) S、 @Sfun,opts,B,P,X,L,D,W,Y,al

我一直使用R,所以我对Matlab很陌生,遇到了一些疑难解答问题。我正在为张量分解方法运行一些代码(可在此处找到:)。首先,我尝试运行演示代码,该代码生成运行该方法所需的模拟数据,导致以下错误:

使用feval时出错 未定义的函数或变量“Sfun”

OptStiefelGBB中的错误(第199行) [F,G]=feval(fun,X,varargin{:});out.nfe=1

tbne_demo>tbne_fun中出错(第124行) S、 @Sfun,opts,B,P,X,L,D,W,Y,alpha,beta)

下面是我正在运行的代码块:

    clear
    clc

    addpath(genpath('./tensor_toolbox'));
addpath(genpath('./FOptM'));
rng(5489, 'twister');

m = 10;
n = 10;
k = 10; % rank for tensor
[X, Z, Y] = tBNE_data(m, n, k); % generate the tensor, guidance and label

[T, W] = tBNE_fun(X, Z, Y, k);

[~, y1] = max(Y, [], 2);
[~, y2] = max(T{3} * W, [], 2);
fprintf('accuracy %3.2e\n', sum(y1 == y2) / n);
function [X, Z, Y] = tBNE_data(m, n, k)
    B = randn(m, k);
    S = randn(n, k);
    A = {B, B, S};
    X = ktensor(A);

    Z = randn(n, 4);

    Y = zeros(n, 2);
    l = ceil(n / 2);
    Y(1 : l, 1) = 1;
    Y(l + 1 : end, 2) = 1;

    X = tensor(X);
end
function [T, W] = tBNE_fun(X, Z, Y, k)
% t-BNE computes brain network embedding based on constrained tensor factorization
%
% INPUT
% X: brain networks stacked in a 3-way tensor
% Z: side information
% Y: label information
% k: rank of CP factorization
%
% OUTPUT
% T is the factor tensor containing
%   vertex factor matrix B = T{1} and
%   subject factor matrix S = T{3}
% W is the weight matrix
%
% Example: see tBNE_demo.m
%
% Reference:
% Bokai Cao, Lifang He, Xiaokai Wei, Mengqi Xing, Philip S. Yu, 
% Heide Klumpp and Alex D. Leow. t-BNE: Tensor-based Brain Network Embedding.
% In SDM 2017.
%
% Dependency:
% [1] Matlab tensor toolbox v 2.6
% Brett W. Bader, Tamara G. Kolda and others
% http://www.sandia.gov/~tgkolda/TensorToolbox 
% [2] A feasible method for optimization with orthogonality constraints
% Zaiwen Wen and Wotao Yin
% http://www.math.ucla.edu/~wotaoyin/papers/feasible_method_matrix_manifold.html

    %% set algorithm parameters
    printitn = 10;
    maxiter = 200;
    fitchangetol = 1e-4;

    alpha = 0.1; % weight for guidance
    beta = 0.1; % weight for classification loss
    gamma = 0.1; % weight for regularization

    u = 1e-6;
    umax = 1e6;
    rho = 1.15;

    opts.record = 0;
    opts.mxitr = 20;
    opts.xtol = 1e-5;
    opts.gtol = 1e-5;
    opts.ftol = 1e-8;

    %% compute statistics
    dim = size(X);
    normX = norm(X);
    numClass = size(Y, 2);
    m = dim(1);
    n = dim(3);
    l = size(Y, 1);
    D = [eye(l), zeros(l, n - l)];
    L = diag(sum(Z * Z')) - Z * Z';

    %% initialization
    B = randn(m, k);
    P = B;
    S = randn(n, k);
    S = orth(S);
    W = randn(k, numClass);
    U = zeros(m, k); % Lagrange multipliers

    %% main loop
    fit = 0;
    for iter = 1 : maxiter
        fitold = fit;
        % update B
        ete = (S' * S) .* (P' * P); % compute E'E
        b = 2 * ete + u * eye(k);
        c = 2 * mttkrp(X, {B, P, S}, 1) + u * P + U;
        B = c / b;

        % update P
        ftf = (S' * S) .* (B' * B); % compute F'F
        b = 2 * ftf + u * eye(k);
        c = 2 * mttkrp(X, {B, P, S}, 2) + u * B - U;
        P = c / b;

        % update U
        U = U + u * (P - B);

        % update u
        u = min(rho * u, umax);

        % update S
        tic;
        [S, out] = OptStiefelGBB(...
            S, @Sfun, opts, B, P, X, L, D, W, Y, alpha, beta);
        tsolve = toc;
        fprintf(...
            ['[S]: obj val %7.6e, cpu %f, #func eval %d, ', ...
            'itr %d, |ST*S-I| %3.2e\n'], ...
            out.fval, tsolve, out.nfe, out.itr, norm(S' * S - eye(k), 'fro'));

        % update W
        H = D * S;
        W = (H' * H + gamma * eye(k)) \ H' * Y;

        % compute the fit
        T = ktensor({B, P, S});
        normresidual = sqrt(normX ^ 2 + norm(T) ^ 2 - 2 * innerprod(X, T));
        fit = 1 - (normresidual / normX);
        fitchange = abs(fitold - fit);

        if mod(iter, printitn) == 0
            fprintf(' Iter %2d: fitdelta = %7.1e\n', iter, fitchange);
        end

        % check for convergence
        if (iter > 1) && (fitchange < fitchangetol)
            break;
        end
    end

    %% clean up final results
    T = arrange(T); % columns are normalized

    fprintf('factorization error %3.2e\n', fit);
end
清除
clc
addpath(genpath('./tensor_工具箱');
addpath(genpath('./FOptM'));
rng(5489,“捻线机”);
m=10;
n=10;
k=10;%张量秩
[X,Z,Y]=tBNE_数据(m,n,k);%生成张量、引导和标签
[T,W]=tBNE_-fun(X,Z,Y,k);
[~,y1]=max(Y,[],2);
[~,y2]=max(T{3}*W,[],2);
fprintf('精度%3.2e\n',和(y1==y2)/n);
函数[X,Z,Y]=tBNE_数据(m,n,k)
B=随机数n(m,k);
S=randn(n,k);
A={B,B,S};
X=K传感器(A);
Z=randn(n,4);
Y=零(n,2);
l=ceil(n/2);
Y(1:l,1)=1;
Y(l+1:结束,2)=1;
X=张量(X);
终止
函数[T,W]=tBNE_-fun(X,Z,Y,k)
%基于约束张量分解的t-BNE计算脑网络嵌入
%
%输入
%X:以三向张量叠加的大脑网络
%Z:旁白
%Y:标签信息
%k:CP因子分解的秩
%
%输出
%T是因子张量
%顶点因子矩阵B=T{1}和
%主题因子矩阵S=T{3}
%W是权重矩阵
%
%示例:参见tBNE_demo.m
%
%参考:
%曹伯凯、何立芳、魏小凯、邢孟琦、余世杰、,
%海德·克伦普和亚历克斯·莱奥。t-BNE:基于张量的脑网络嵌入。
%2017年可持续发展目标。
%
%依赖关系:
%[1]Matlab张量工具箱v 2.6
%Brett W.Bader、Tamara G.Kolda等人
% http://www.sandia.gov/~tgkolda/TensorToolbox
%[2]正交约束优化的一种可行方法
%温在文与尹沃涛
% http://www.math.ucla.edu/~wotaoyin/papers/approval_method_matrix_manifolm.html
%%设置算法参数
printitn=10;
maxiter=200;
fitchangetol=1e-4;
α=0.1;%指导权
β=0.1;%分类损失权重
伽马=0.1;%正则化权重
u=1e-6;
umax=1e6;
rho=1.15;
opts.record=0;
opts.mxitr=20;
opts.xtol=1e-5;
opts.gtol=1e-5;
opts.ftol=1e-8;
%%计算统计数据
尺寸=尺寸(X);
normX=norm(X);
numClass=大小(Y,2);
m=dim(1);
n=dim(3);
l=尺寸(Y,1);
D=[眼睛(l),零(l,n-l)];
L=diag(和(Z*Z'))-Z*Z';
%%初始化
B=随机数n(m,k);
P=B;
S=randn(n,k);
S=ORH(S);
W=randn(k,numClass);
U=零(m,k);%拉格朗日乘数
%%主回路
拟合=0;
对于iter=1:maxiter
fitold=适合;
%更新B
ete=(S'*S)。*(P'*P);%计算E'E
b=2*ete+u*eye(k);
c=2*mttkrp(X,{B,P,S},1)+u*P+u;
B=c/B;
%更新P
ftf=(S'*S)。*(B'*B);%计算F'F
b=2*ftf+u*eye(k);
c=2*mttkrp(X,{B,P,S},2)+u*B-u;
P=c/b;
%更新U
U=U+U*(P-B);
%更新u
u=最小值(rho*u,umax);
%更新
抽搐;
[S,out]=OptStiefelGBB(。。。
S、 @Sfun,opts,B,P,X,L,D,W,Y,alpha,beta);
tsolve=toc;
fprintf(。。。
['[S]:对象值%7.6e,cpu%f,#函数值%d。。。
'itr%d,| ST*S-I |%3.2e\n']。。。
out.fval,tsolve,out.nfe,out.itr,norm(S'*S-eye(k),'fro');
%更新W
H=D*S;
W=(H'*H+伽马*眼(k))\H'*Y;
%计算拟合
T=k传感器({B,P,S});
norm残差=sqrt(normX^2+norm(T)^2-2*innerprod(X,T));
拟合=1-(正常剩余/正常x);
fitchange=abs(fitold-fit);
如果mod(iter,printitn)==0
fprintf('Iter%2d:fitdelta=%7.1e\n',Iter,fitchange);
终止
%检查收敛性
如果(iter>1)和(fitchange
我知道这里没有什么上下文,但我怀疑我需要Simulink,因为Sfun是一个与Simulink相关的函数(?)。该脚本需要两个工具箱:tensor_工具箱和FOptM

网址:

非常感谢你的帮助


Paul

虽然
SFun
是Simulink S函数的常用缩写,但在这种情况下,错误与Simulink无关,名称是巧合。(没有专门称为
Sfun
的Simulink相关函数,它只是一个通用术语。)

您的错误消息中包含
@Sfun
,这是在MATLAB中创建
函数句柄
到名为
Sfun
的(m-code)函数的一种方法。我将从您展示的代码中总结,这是优化中使用的成本函数


如果查看代码所基于的代码(),您将看到文件末尾有一个名为
Sfun
的函数。你错过的就是这个。

哇,我真烂。非常感谢你。