⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subsasgn.m

📁 张量分析工具
💻 M
字号:
function x = subsasgn(x,s,b)%SUBSASGN Subscripted assignment for a tensor.%%   We can assign elements to a tensor in three ways.%%   Case 1: X(R1,R2,...,RN) = Y, in which case we replace the%   rectangular subtensor (or single element) specified by the ranges%   R1,...,RN with Y. The right-hand-side can be a scalar, a tensor, or an%   MDA. %%   Case 2a: X(S) = V, where S is a p x n array of subscripts and V is%   a scalar or a vector containing p values.%%   Case 2b: X(I) = V, where I is a set of p linear indices and V is a%   scalar or a vector containing p values. Resize is not allowed in this%   case. %%   Examples%   X = tensor(rand(3,4,2))%   X(1:2,1:2,1) = ones(2,2) %<-- replaces subtensor%   X([1 1 1;1 1 2]) = [5;7] %<-- replaces two elements%   X([1;13]) = [5;7] %<-- does the same thing%   X(1,1,2:3) = 1 %<-- grows tensor%   X(1,1,4) = 1 %<- grows the size of the tensor%%   See also TENSOR, TENSOR/SUBSREF.%%MATLAB Tensor Toolbox.%Copyright 2007, Sandia Corporation.% This is the MATLAB Tensor Toolbox by Brett Bader and Tamara Kolda.% http://csmr.ca.sandia.gov/~tgkolda/TensorToolbox.% Copyright (2007) Sandia Corporation. Under the terms of Contract% DE-AC04-94AL85000, there is a non-exclusive license for use of this% work by or on behalf of the U.S. Government. Export of this data may% require a license from the United States Government.% The full license terms can be found in tensor_toolbox/LICENSE.txt% $Id: subsasgn.m,v 1.8 2007/01/10 01:27:31 bwbader Exp $switch s.type    case '.'        error(['Cannot change field ', s.subs, ' directly.']);    case '{}'        error('Subscript cell reference not supported for tensor.');    case '()'        % We don't allow sub-subscriptingfor tensors.        if numel(s) ~= 1            error('Invalid subscripting');        end        % Figure out if we are doing a subtensor, a list of subscripts, or        % a list of linear indices...        type = 'error';        if ndims(x) == 1           if (numel(s.subs) > 1) || ...                   ((ndims(s.subs{1}) == 2) && ...                    (size(s.subs{1},1) == 1  || size(s.subs{1},2) == 1))               type = 'subtensor';           elseif ndims(s.subs{1}) == 2               type = 'subscripts';           end        else            if numel(s.subs) >= ndims(x)                type = 'subtensor';            elseif ndims(s.subs{1}) == 2                if size(s.subs{1},2) >= ndims(x)                    type = 'subscripts';                elseif size(s.subs{1},2) == 1                    type = 'linear indicies';                end            end        end        % *** CASE 1: Rectangular Subtensor ***        if isequal(type,'subtensor')            if isa(b,'tensor')                x.data(s.subs{:},1) = b.data;            else                x.data(s.subs{:},1) = b;            end            % Check if the size has grown!            % Can't vectorize this due to possible trailing 1's            for i = 1:numel(x.size)                x.size(i) = max(x.size(i),size(x.data,i));            end            % Check if order has grown            for i = numel(x.size)+1:numel(s.subs)                x.size(i) = size(x.data,i);            end            return;        end        % *** CASE 2a: Subscript indexing ***        if isequal(type,'subscripts');            % extract array of subscripts            subs = s.subs{1};            % will the size change? if so, we first need to resize x            n = ndims(x);            bsiz = max(subs,[],1);            newsiz = [max([x.size;bsiz(1:n)]) bsiz(n+1:end)];            if ~isequal(newsiz,x.size)                % We need to enlarge x.data. A trick is to assign its last                % "new" element to zero. This resizes the array correctly.                if numel(newsiz) == 1                    str = sprintf('x.data(%d)=0;',newsiz);                else                    str = [sprintf('x.data(') ...                        sprintf('%d,',newsiz(1:end-1)) ...                        sprintf('%d)=0;', newsiz(end)) ];                end                eval(str);                x.size = newsiz;            end            % finally, we can copy in the new data            x.data(tt_sub2ind(newsiz,subs)) = b;            return;        end        % *** CASE 2b: Linear indexing ***        if isequal(type,'linear indicies');            idx = s.subs{1};            x.data (idx) = b;            return        end                error('Invalid use of tensor/subsasgn');end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -