matlab中的sparse函数使用

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

sparse

创建稀疏矩阵

说明

示例

S = sparse(A) 通过挤出任何零元素将满矩阵转换为稀疏格式。如果矩阵包含许多零,将矩阵转换为稀疏存储空间可以节省内存。

示例

S = sparse(m,n) 生成 m×n 全零稀疏矩阵。

示例

S = sparse(i,j,v) 根据 ijv 三元组生成稀疏矩阵 S,以便 S(i(k),j(k)) = v(k)max(i)×max(j) 输出矩阵为 length(v) 个非零值元素分配了空间。

如果输入 ijv 为向量或矩阵,则它们必须具有相同数量的元素。参数 v 和/或 ij 其中一个参数可以使标量。

示例

S = sparse(i,j,v,m,n)S 的大小指定为 m×n

示例

S = sparse(i,j,v,m,n,nz)nz 非零元素分配空间。可以使用此语法为构造后要填充的非零值分配额外空间。

示例

全部折叠

使用稀疏存储空间节省内存

whos A

  Name          Size                   Bytes  Class     Attributes

A 10000x10000 800000000 double

此矩阵使用 800 MB 内存。

将矩阵转换为稀疏存储。

S = sparse(A);
whos S
  Name          Size                Bytes  Class     Attributes

S 10000x10000 240008 double sparse

采用稀疏形式时,同一矩阵只使用约 0.25 MB 内存。在这种情况下,您可以使用 speye 函数来避免满存储,该函数可以直接创建稀疏单位矩阵。

全零稀疏矩阵

All zero sparse: 10000x5000

指定大小的非零稀疏矩阵

j = [900 1000];
v = [10 100];
S = sparse(i,j,v,1500,1500)

S =
(900,900) 10
(1000,1000) 100

当指定的大小大于 max(i)×max(j) 时,sparse 函数会使用额外的零值行和列填充输出。

size(S)
ans = 1×2
    1500        1500

预分配稀疏矩阵中的存储空间

N = nnz(S)

N = 10
N_alloc = nzmax(S)
N_alloc = 100

spalloc 函数可以快速创建由全零元素构成的稀疏矩阵,同时还会在此矩阵中为非零数数值分配一定的存储空间。

将值累加到稀疏矩阵

j = [1 1 1 2 3 3 10 10]’;
v = [100 202 173 305 410 550 323 121]’;

并排显示下标和值。

[i,j,v]
ans = 8×3
 6     1   100
 6     1   202
 6     1   173
 5     2   305
10     3   410
10     3   550
 9    10   323
 9    10   121

使用 sparse 函数将具有相同下标的值累加。

S = sparse(i,j,v)
S =
(6,1) 475
(5,2) 305
(10,3) 960
(9,10) 444

输入参数

全部折叠

A - 输入矩阵
满矩阵 | 稀疏矩阵

输入矩阵,指定为满矩阵或稀疏矩阵。如果 A 已为稀疏状态,则 sparse(A) 会返回 A

数据类型: double | logical
复数支持:

i,j - 下标对组(以单独参数指定)
标量 | 向量 | 矩阵

下标对组,指定为标量、向量或矩阵的单独参数。ij 中的对应元素指定 S(i,j) 的下标对组,该对组决定 v 中的值在输出中的放置方式。ij 必须具有相同的数据类型。如果 ij 为向量或矩阵,则另一个输入可以是标量或者是具有相同元素数量的向量或矩阵。在这种情况下,sparse 会使用 i(:)j(:) 作为下标。

如果 ijv 中的几个元素具有相同的值,则 sparse 会聚合 v 中具有重复索引的值。聚合行为取决于 v 中值的数据类型:

  • 对于逻辑值,sparse 应用 any 函数。

  • 对于双精度值,sparse 应用 sum 函数。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

v - 值
标量 | 向量 | 矩阵

值,指定为标量、向量或矩阵。如果 v 是向量或矩阵,则 ij 的其中一个输入必须也是具有相同数量的元素的向量或矩阵。

v 中的任何零值元素都会被忽略,因为它们是 ij 的对应下标。但是,如果您不指定输出的维度大小 mn,则 sparse 在忽略 v 中的任何零值元素之前,会先计算最大值 m = max(i)n = max(j)

数据类型: double | logical
复数支持:

m,n - 每个维度的大小(作为单独参数)
整数值

每个维度的大小,指定为包含整数值的单独参数。如果指定 m(行大小),则必须也指定 n(列大小)。

如果不指定 mn,则 sparse 将使用默认值 m = max(i)n = max(j)。这些最大值在删除 v 中的任何零之前进行计算。

数据类型: double

nz - 非零元素的存储空间分配
非负整数

非零元素的存储空间分配,指定为非负整数。nz 通常必须大于或等于 max([numel(i), numel(j), numel(v), 1])。但是,如果 ijv 的大小允许您为 nz 指定值 0,则 sparse 会将该值设置为 1

对于稀疏矩阵 Snnz 函数返回矩阵中非零元素的数目,nzmax 函数返回为非零矩阵元素分配的空间量。如果 nnz(S)nzmax(S) 返回不同的结果,则可能需要分配比实际需求更大的空间。鉴于此原因,请预先设置 nz,再进行填充。

如果您不指定 nz,则 sparse 使用默认值 max([numel(i), numel(j), numel(v), 1])

数据类型: double

局限性

  • 如果 i,jm,n 输入中的任意值大于 2^31-1(32 位平台)或 2^48-1(64 位平台),则无法构造稀疏矩阵。

提示

  • MATLAB® 以压缩稀疏列格式存储稀疏矩阵。有关详细信息,请参阅 John R. Gilbert、Cleve Moler 和 Robert Schreiber 合著的 Sparse Matrices In MATLAB:Design and Implementation

  • accumarray 函数具有与 sparse 类似的累加行为。

    • accumarray 使用 n 维下标将数据分组到 bin 中,而 sparse 使用二维下标将数据分组到 bin 中。

    • 默认情况下,accumarray 会将具有相同下标的元素添加到输出中,但您可以选择对 bin 应用任意函数。sparse 会在输出中对具有相同下标的元素应用 sum 函数(对于双精度值)或 any 函数(对于逻辑值)。

扩展功能

用法说明和限制:

  • 行数、列数和非零元素数的值都必须小于 intmax

  • 在 MATLAB 中,可以使用标量扩展构造稀疏矩阵。例如,sparse([1 2],[3 4], 2)。对于代码生成,您只能对编译时标量输入使用标量扩展。作为运行时标量的可变大小数组不能扩展。

        </p></div><span id="mw_1dc4a221-ddc3-46ab-894c-c46f2e518724" class="anchor_target"></span><span id="bul5blm" class="anchor_target"></span><h3 class="expand_trigger collapsed" id="bul5blm_gpuarrays" aria-expanded="false" data-toggle="collapse" data-target="#expand_body_bul5blm_gpuarrays" aria-controls="expand_body_bul5blm_gpuarrays"><span class="icon-arrow-open-down"></span><span class="icon-arrow-open-right"></span>GPU 数组<br> <span class=" remove_bold add_font_color_general">通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。</span></h3><div id="expand_body_bul5blm_gpuarrays" class="collapsible_content collapse" aria-expanded="false"><p>此函数完全支持 GPU 数组。有关详细信息,请参阅<a href="../../parallel-computing/run-matlab-functions-on-a-gpu.html" class="a" hreflang="en">Run MATLAB Functions on a GPU</a><span role="cross_prod"> (Parallel Computing Toolbox)</span>。</p></div><span id="mw_28229bf5-eb9e-44c8-9583-150907ca7edb" class="anchor_target"></span><span id="bul5blm" class="anchor_target"></span><h3 class="expand_trigger collapsed" id="bul5blm_distributedarrays" aria-expanded="false" data-toggle="collapse" data-target="#expand_body_bul5blm_distributedarrays" aria-controls="expand_body_bul5blm_distributedarrays"><span class="icon-arrow-open-down"></span><span class="icon-arrow-open-right"></span>分布式数组<br>

使用 Parallel Computing Toolbox™ 在群集的组合内存中对大型数组进行分区。

此函数完全支持分布式数组。有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。

在 R2006a 之前推出

  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值