【张量|TCTV】t-CTV 代码分析与实验结果

porder_diff

  • 计算张量 X 在指定方向 index 上的差分
  • 返回一个与 X 尺寸相同的张量,表示在该方向上的差分结果。
function DX = porder_diff(X, direction) % 计算沿指定方向的差分张量(梯度图)

% 获取张量X的尺寸
dim = size(X);

% 初始化索引,适用于多维数组
index_first = repmat({':'}, 1, ndims(X));  % 创建一个元胞数组,长度为 X 的维度数,每个元素都是':'
index_first(direction) = {1};  % 将指定方向的索引设置为1(表示第一个元素)
index_end = repmat({':'}, 1, ndims(X));  % 创建另一个元胞数组,长度为X的维度数,每个元素都是':'
index_end(direction) = {dim(direction)};  % 将指定方向的索引设置为该维度的最后一个元素

% 计算起始切片和结束切片的差
slice = X(index_first{:}) - X(index_end{:});

% 计算沿指定方向的差分
DX = diff(X, 1, direction);

% 将计算的差分和切片差拼接起来
DX = cat(direction, DX, slice);
  • 详细解释:

    1. 获取张量 X 的尺寸

      dim = size(X);
      
      • dim 是一个包含 X 各个维度尺寸的向量。例如,如果 X 是一个 3D 张量,其尺寸为 [4, 5, 6],那么 dim 将是 [4, 5, 6]
    2. 初始化索引

      index_first = repmat({':'}, 1, ndims(X));
      index_end = repmat({':'}, 1, ndims(X));
      
      • index_firstindex_end 初始化为适用于多维数组的全选索引。例如,对于一个 3D 张量,这些索引初始为 {':', ':', ':'}。表示全选该维度上的所有元素。
    3. 设置起始和结束索引

      index_first(direction) = {1};
      index_end(direction) = {dim(direction)};
      
      • index_first 在指定 direction 方向上的索引设置为 1,表示**只选取该维度上的第一个元素。**例如,如果 direction = 2X 是一个 3D 张量,index_first 将变为 {'', '1', ''},表示选取第二维的第一个元素。
      • index_end 在指定 direction 方向上的索引设置为该维度的最后一个元素dim(direction) 返回张量 Xdirection ****方向上的尺寸。例如,如果 direction = 2dim = [4, 5, 6]index_end 将变为 {'', '5', ''},表示选取第二维的最后一个元素。
    4. 计算起始和结束切片的差

      slice = X(index_first{:}) - X(index_end{:});
      
      • 计算 Xdirection 方向上第一个元素与最后一个元素的差,形成一个切片 slice
    5. 计算沿指定方向的差分

      DX = diff(X, 1, direction);
      
      • 使用 MATLAB 的 diff 函数计算沿 direction 方向的一阶差分,结果存储在 DX 中。
    6. 将差分结果和切片差拼接起来

      DX = cat(direction, DX, slice);
      
      • 将差分结果 DX 与切片差 slice 沿 direction 方向拼接,得到最终的差分张量 DX

    通过这些步骤,porder_diff 函数实现了沿指定方向计算张量的差分并将起始和结束元素的差作为补充,确保差分张量的维度与原始张量一致。

porder_diff_T

  • 计算张量 Y 在指定方向 index ****上的转置差分。
  • 应返回一个与 Y 尺寸相同的张量,表示在该方向上的转置差分结果。

diff_element

  • 计算在指定方向 direction 上的差分元素矩阵。
  • 应返回一个与 dim 兼容的张量,表示在该方向上的差分元素。
function Eny = diff_element(dim, direction)
    d = length(dim);                  % 获取维度向量的长度
    e = ones(1, d);                   % 创建一个长度为 d 的全为 1 的向量
    element1 = ones(e);               % 创建一个形状为 e 的全 1 数组
    element2 = -1 * ones(e);          % 创建一个形状为 e 的全 -1 数组
    element = cat(direction, element1, element2); % 在指定方向上拼接 element1 和 element2
    Eny = (abs(psf2otf(element, dim))).^2; % 将点扩散函数转换为光学传递函数并取绝对值平方
end

prox_htnn_F

  • 计算张量 X傅里叶变换下的近端算子,参数 tau 用于调整。
  • 应返回一个与 X 尺寸相同的张量,表示近端算子的结果和张量核范数。
function [X,htnn,tsvd_rank] = prox_htnn_F(Y,rho)

%The proximal operator for the order-D tensor nuclear norm under Discrete Fourier Transform (DFT)

p = length(size(Y));
n = zeros(1,p);
for i = 1:p
    n(i) = size(Y,i);
end

X = zeros(n);
L = ones(1,p);
for i = 3:p
    Y = fft(Y,[],i);
    L(i) = L(i-1) * n(i);
end

htnn = 0;
tsvd_rank = 0;
        
[U,S,V] = svd(Y(:,:,1),'econ');
S = diag(S);
r = length(find(S>rho));
if r>=1
    S = max(S(1:r)-rho,0);
    X(:,:,1) = U(:,1:r)*diag(S)*V(:,1:r)';
    htnn = htnn+sum(S);
    tsvd_rank = max(tsvd_rank,r);
end

for j = 3 : p
    for i = L(j-1)+1 : L(j)
   %
        I = unfoldi(i,j,L);
        halfnj = floor(n(j)/2)+1;
   %
        if I(j) <= halfnj && I(j) >= 2
            [U,S,V] = svd(Y(:,:,i),'econ');
            S = diag(S);
            r = length(find(S>rho));
            if r>=1
                S = max(S(1:r)-rho,0);
                X(:,:,i) = U(:,1:r)*diag(S)*V(:,1:r)';
                htnn = htnn+sum(S)*2;
                tsvd_rank = max(tsvd_rank,r);
            end
            
        %Conjugation property
        elseif I(j) > halfnj
            %
            n_ = nc(I,j,n);
            %
            i_ = foldi(n_,j,L);
            X(:,:,i) = conj( X(:,:,i_));
                
        end
    end
end

htnn = htnn/prod(n(3:end));

for i = p:-1:3
    X = (ifft(X,[],i));
end
X = real(X);

prox_htnn_C

  • 计算张量 X 在余弦变换下的近端算子,参数 tau 用于调整。
  • 应返回一个与 X 尺寸相同的张量,表示近端算子的结果和张量核范数。

⭐TCTV_TC

问题描述

我们希望通过最小化张量的相关全变差(Tensor Correlated Total Variation, TCTV)范数来完成张量的恢复。这个问题可以用如下优化模型表示:

min ⁡ X ∥ X ∥ TCTV subject to P Ω ( X ) = P Ω ( M ) \min_{X} \|X\|_{\text{TCTV}} \quad \text{subject to} \quad P_\Omega(X) = P_\Omega(M) XminXTCTVsubject toPΩ(X)=PΩ(M)

其中:

  • M M M 是观测到的 p p p 阶张量。
  • X X X 是恢复的 p p p 阶张量。
  • ∥ X ∥ TCTV \|X\|_{\text{TCTV}} XTCTV 是张量 X X X 的 TCTV 范数。
  • P Ω ( ⋅ ) P_\Omega(\cdot) PΩ() 是在已知观测位置集 Ω \Omega Ω 上的投影操作。

更新公式的推导

1. 优化 X X X

在更新 X X X 时,我们需要最小化如下目标函数:

∥ X ∥ TCTV + μ 2 ∥ P Ω ( X ) − P Ω ( M ) ∥ F 2 + μ 2 ∥ M − X − E + Λ μ ∥ F 2 \|X\|_{\text{TCTV}} + \frac{\mu}{2} \|P_\Omega(X) - P_\Omega(M)\|_F^2 + \frac{\mu}{2} \|M - X - E + \frac{\Lambda}{\mu}\|_F^2 XTCTV+2μPΩ(X)PΩ(M)F2+2μMXE+μΛF2

为了使这部分容易处理,使用频域变换(例如傅里叶变换)将问题转换到频域。通过这种方式,差分操作可以转化为简单的乘法,从而简化了 TCTV范数的计算。

X = F − 1 ( F ( μ ( M − E + Λ / μ ) + H ) μ ( 1 + T ) ) X = \mathcal{F}^{-1} \left( \frac{\mathcal{F}(\mu (M - E + \Lambda / \mu) + H)}{\mu(1 + T)} \right) X=F1(μ(1+T)F(μ(ME+Λ/μ)+H))

其中 F \mathcal{F} F 表示傅里叶变换, F − 1 \mathcal{F}^{-1} F1 表示逆傅里叶变换, T T T 是差分操作频谱。

2. 优化 E

在更新 E E E 时,我们需要最小化如下目标函数:

  E = arg ⁡ min ⁡ E ( μ 2 ∥ E − ( M − X + Λ μ ) ∥ F 2 )  E = \arg\min_E \left( \frac{\mu}{2} \|E - (M - X + \frac{\Lambda}{\mu})\|_F^2 \right)  E=argEmin(2μE(MX+μΛ)F2)

这是一个简单的二次优化问题,其解析解为:

  E = M − X + Λ / μ  E = M - X + \Lambda / \mu  E=MX+Λ/μ

为了确保 E E E Ω \Omega Ω 上等于零:
E ( Ω ) = 0 E(\Omega) = 0 E(Ω)=0

3. 更新拉格朗日乘子 Λ \Lambda Λ

更新拉格朗日乘子的公式源自标准的 ADMM 更新规则:
Λ k + 1 = Λ k + μ ( M − X k + 1 − E k + 1 ) \Lambda^{k+1} = \Lambda^k + \mu (M - X^{k+1} - E^{k+1}) Λk+1=Λk+μ(MXk+1Ek+1)

具体实现

这些公式在代码中通过以下步骤实现:

  1. 变量初始化:

    n = length(directions);
    X = randn(dim);
    X(Omega) = M(Omega);
    E = zeros(dim);
    Lambda = zeros(dim);
    
    • X X X : 初始恢复张量,通常初始化为在 Ω \Omega Ω 上等于 M M M随机张量
    • E E E : 初始误差张量,初始化为零张量
    • Λ \Lambda Λ : 拉格朗日乘子,初始化为零张量
    • G G G : 每个方向的差分张量,初始化为零张量
    • Γ \Gamma Γ : 每个方向的拉格朗日乘子,初始化为零张量。s
    • 其他参数:根据输入 opts 初始化。
  2. 更新 X:

    H = zeros(dim);
    for i = 1:n
        index = directions(i);
        H = H + porder_diff_T(mu * G{index} - Gamma{index}, index);
    end
    X = real(ifftn(fftn(mu * (M - E) + Lambda + H) ./ (mu * (1 + T))));
    

    X k + 1 = arg ⁡ min ⁡ X ( ∥ X ∥ TCTV + μ 2 ∥ P Ω ( X ) − P Ω ( M ) ∥ F 2 + μ 2 ∥ M − X − E + Λ μ ∥ F 2 ) X^{k+1} = \arg\min_X \left( \|X\|_{\text{TCTV}} + \frac{\mu}{2} \|P_\Omega(X) - P_\Omega(M)\|_F^2 + \frac{\mu}{2} \|M - X - E + \frac{\Lambda}{\mu}\|_F^2 \right) Xk+1=argXmin(XTCTV+2μPΩ(X)PΩ(M)F2+2μMXE+μΛF2)

  3. 更新 E:

    E = M - X + Lambda / mu;
    E(Omega) = 0;
    

      E k + 1 = arg ⁡ min ⁡ E ( μ 2 ∥ E − ( M − X + Λ μ ) ∥ F 2 )  E^{k+1} = \arg\min_E \left( \frac{\mu}{2} \|E - (M - X + \frac{\Lambda}{\mu})\|_F^2 \right)  Ek+1=argEmin(2μE(MX+μΛ)F2)

  4. 更新拉格朗日乘子 Λ \Lambda Λ:

    Lambda = Lambda + mu * (M - X - E);
    for i = 1:n
        index = directions(i);
        Gamma{index} = Gamma{index} + mu * (porder_diff(X, index) - G{index});
    end
    mu = min(rho * mu, max_mu);
    

      Λ k + 1 = Λ k + μ ( M − X k + 1 − E k + 1 )  \Lambda^{k+1} = \Lambda^k + \mu (M - X^{k+1} - E^{k+1})  Λk+1=Λk+μ(MXk+1Ek+1)

⭐TCTV_TRPCA

问题描述

我们希望通过最小化张量的相关全变差(Tensor Correlated Total Variation, TCTV)范数和稀疏误差项来从观察到的张量 M M M 中分离出低秩张量 X X X 和稀疏张量 E E E 。这个问题可以用如下优化模型表示:

min ⁡ X , E ∥ X ∥ TCTV + λ ∥ E ∥ 1 subject to M = X + E \min_{X, E} \|X\|_{\text{TCTV}} + \lambda \|E\|_1 \quad \text{subject to} \quad M = X + E X,EminXTCTV+λE1subject toM=X+E

其中:

  • M M M 是观测到的 p p p 阶张量。
  • X X X 是恢复的低秩 p p p 阶张量。
  • E E E 是稀疏 p p p 阶张量。
  • ∥ X ∥ TCTV \|X\|_{\text{TCTV}} XTCTV 是张量 X X X 的 TCTV 范数。
  • ∥ E ∥ 1 \|E\|_1 E1 是张量 E E E ℓ 1 \ell_1 1 范数。
  • λ \lambda λ 是控制低秩项和稀疏项之间权衡的正则化参数。

相关公式

  • 张量的相关全变差 (TCTV) 范数:

    ∥ X ∥ TCTV = ∑ i = 1 n ∥ ∇ i X ∥ ∗ \|X\|_{\text{TCTV}} = \sum_{i=1}^n \| \nabla_i X \|_* XTCTV=i=1niX

    其中 ∇ i \nabla_i i 是在第 i i i 个方向上的差分操作, ∥ ⋅ ∥ ∗ \| \cdot \|_* 表示张量的核范数。

  • 稀疏张量的 ℓ 1 \ell_1 1 范数:

    ∥ E ∥ 1 = ∑ i = 1 p ∑ j = 1 n i ∣ E i j ∣ \|E\|_1 = \sum_{i=1}^p \sum_{j=1}^{n_i} |E_{ij}| E1=i=1pj=1niEij

各部分代码的数学模型对应关系

  1. 变量初始化:

    X = randn(dim);
    E = zeros(dim);
    Lambda = zeros(dim);
    
    • X X X : 初始低秩张量,通常初始化为随机张量
    • E E E : 初始稀疏张量,初始化为零张量
    • Λ \Lambda Λ : 拉格朗日乘子,初始化为零张量
    • G G G : 每个方向的差分张量,初始化为零张量
    • Γ \Gamma Γ : 每个方向的拉格朗日乘子,初始化为零张量
    • 其他参数:根据输入 opts 初始化。
  2. 更新 X:

    H = zeros(dim);
    for i = 1:n
        index = directions(i);
        H = H + porder_diff_T(mu * G{index} - Gamma{index}, index);
    end
    X = real(ifftn(fftn(mu * (M - E) + Lambda + H) ./ (mu * (1 + T))));
    

    X = F − 1 ( F ( μ ( M − E + Λ / μ ) + H ) μ ( 1 + T ) ) X = \mathcal{F}^{-1} \left( \frac{\mathcal{F}(\mu(M - E + \Lambda/\mu) + H)}{\mu(1 + T)} \right) X=F1(μ(1+T)F(μ(ME+Λ/μ)+H))

    其中 F \mathcal{F} F 表示快速傅里叶变换, H H H 是由 G G G Γ \Gamma Γ 计算的辅助张量 T T T 是差分操作的频谱。

  3. 更新 G:

    for i = 1:n
        index = directions(i);
        switch transform
            case 'DFT'
                [G{index}, tnn_G{index}] = prox_htnn_F(porder_diff(X, index) + Gamma{index} / mu, 1 / (n * mu));
            case 'DCT'
                [G{index}, tnn_G{index}] = prox_htnn_C(porder_diff(X, index) + Gamma{index} / mu, 1 / (n * mu));
            case 'other'
                [G{index}, tnn_G{index}] = prox_htnn_C(transform_matrices, porder_diff(X, index) + Gamma{index} / mu, 1 / (n * mu));
        end
    end
    

    G i = prox htnn ( ∇ i X + Γ i / μ , 1 n μ ) G_i = \text{prox}_{\text{htnn}}\left( \nabla_i X + \Gamma_i / \mu, \frac{1}{n\mu} \right) Gi=proxhtnn(iX+Γi/μ,nμ1)

    其中 ∇ i \nabla_i i 表示在第 i i i 个方向上的差分操作。

  4. 更新 E:

    E = prox_l1(M - X + Lambda / mu, lambda / mu);
    

    E = prox ℓ 1 ( M − X + Λ / μ , λ / μ ) E = \text{prox}_{\ell_1}(M - X + \Lambda / \mu, \lambda / \mu) E=prox1(MX+Λ/μ,λ/μ)

  5. **停止条件:**当迭代步数达到最大迭代次数或变化量小于预设容差时停止。

    dY = M - X - E;
    chgX = max(abs(Xk(:) - X(:)));
    chgE = max(abs(Ek(:) - E(:)));
    chg = max([chgX chgE max(abs(dY(:)))]);
    if chg < tol
        break;
    end
    
  6. 更新拉格朗日乘子和步长:

    Lambda = Lambda + mu * dY;
    for i = 1:n
        index = directions(i);
        Gamma{index} = Gamma{index} + mu * (porder_diff(X, index) - G{index});
    end
    mu = min(rho * mu, max_mu);
    

    Λ = Λ + μ ( M − X − E ) \Lambda = \Lambda + \mu (M - X - E) Λ=Λ+μ(MXE)

    Γ i = Γ i + μ ( ∇ i X − G i ) \Gamma_i = \Gamma_i + \mu (\nabla_i X - G_i) Γi=Γi+μ(iXGi)

    μ = min ⁡ ( ρ μ , max_mu ) \mu = \min(\rho \mu, \text{max\_mu}) μ=min(ρμ,max_mu)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/750459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文降重困难重重?AI降重来帮忙

论文查重和降重是确保学术成果原创性及学术诚信的关键步骤&#xff0c;直接影响我们的学业成果和毕业资格。传统的论文查重方法主要包括使用查重软件和个人自查&#xff0c;而论文降重通常涉及改写、使用同义词替换、内容的扩展和深化&#xff0c;以及正确的引用和注释等方式来…

企业数据治理的下一步是数据资产管理?

随着信息技术的飞速发展和数字化转型的深入推进&#xff0c;企业数据已成为驱动业务增长和创新的核心要素。当企业数据治理工作取得显著成效后&#xff0c;如何进一步发挥数据的价值&#xff0c;实现数据资产的有效管理&#xff0c;成为企业面临的重要课题。 数据治理的基石作用…

记录一次OPDS trunc()函数使用错误

说明&#xff1a;本文介绍 场景 在一次SQL查询时&#xff0c;需要对结果值保留两位小数&#xff0c;不四舍五入&#xff0c;直接截取到小数点后两位。如 59.156到59.15&#xff0c;23.2134到23.21&#xff0c;查看官方帮助文档&#xff08;https://help.aliyun.com/zh/maxcom…

8个Unity开发高手都在用的秘密技巧!

1. 不要重新发明轮子&#xff0c;使用内置的引擎工具 在使用任何引擎时&#xff0c;比如Unity或Unreal Engine&#xff0c;一些开发者&#xff0c;主要是来自计算机科学领域的开发者&#xff0c;可能会倾向于从头开始开发大型算法或结构&#xff0c;而不去了解引擎中是否已经存…

多线程(基础)

前言&#x1f440;~ 上一章我们介绍了什么是进程&#xff0c;对于进程就了解那么多即可&#xff0c;我们作为java程序员更关注线程&#xff0c;线程内容比较多&#xff0c;所以我们要分好几部分才能讲完 目录 进程的缺点 多线程&#xff08;重要&#xff09; 进程和线程的区…

数据分析必备:一步步教你如何用matplotlib做数据可视化(14)

1、Matplotlib 图像 Matplotlib包中的图像模块提供加载&#xff0c;重新缩放和显示图像所需的功能。Pillow库支持加载图像数据。Matplotlib仅支持PNG图像。如果本机读取失败&#xff0c;下面显示的命令将回退到Pillow。 此示例中使用的图像是PNG文件&#xff0c;但请记住数据的…

计算机网络之奇偶校验码和CRC冗余校验码

今天我们来看看有关于计算机网络的知识——奇偶校验码和CRC冗余校验码&#xff0c;这两种检测编码的方式相信大家在计算机组成原理当中也有所耳闻&#xff0c;所以今天我就来跟大家分享有关他们的知识。 奇偶校验码 奇偶校验码是通过增加冗余位使得码字中1的个数恒为奇数或偶数…

JS在线加密简述

JS在线加密&#xff0c;是指&#xff1a;在线进行JS代码混淆加密。通过混淆、压缩、加密等手段&#xff0c;使得JS源代码难以阅读和理解。从而可以有效防止代码被盗用或抄袭&#xff0c;保护开发者的知识产权和劳动成果。常用的JS在线加密网站有&#xff1a;JShaman、JS-Obfusc…

AI写作助力:如何用AI降重工具快速提升论文原创性?

高查重率是许多毕业生的困扰。通常&#xff0c;高查重率源于过度引用未经修改的参考资料和格式错误。传统的降重方法&#xff0c;如修改文本和增添原创内容&#xff0c;虽必要但耗时且成效不一。 鉴于此&#xff0c;应用AI工具进行AIGC降重成为了一个高效的解决方案。这些工具…

线性相关,无关?秩?唯一解(只有零解),无穷解(有非零解)?D=0,D≠0?

目录 线性有关无关 和 唯一解&#xff08;只有零解&#xff09;&#xff0c;无穷解&#xff08;有非零解&#xff09;之间的关系 D0&#xff0c;D≠0&#xff1f; 和 秩 的关系 串起来&#xff1a; 线性相关&#xff0c;无关&#xff1f;秩&#xff1f;唯一解&#xff08;只…

cuda 学习笔记4

一 基本函数 在GPU上开辟空间&#xff0c;无论定义的数据是float还是int ,还是****gpu_int,分配空间的函数都是下面固定的形式 (void**)& 1.函数定义&#xff0c;global void 是配套使用的&#xff0c;是在GPU上定义&#xff0c;也就是GPU上执行&#xff0c;CPU上调用的函数…

【软件测试】白盒测试与接口测试详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是白盒测试 白盒测试是一种测试策略&#xff0c;这种策略允许我们检查程序的内部结构&a…

短视频带货实战营(高阶课),从0到1做个赚钱的抖音号(17节课)

课程目录&#xff1a; 1-短视频带贷先导课_1.mp4 2-账号搭建_1.mp4 3-账号养号涨粉套路_1.mp4 4-开通橱窗_1.mp4 5-管家式选品_1.mp4 6-六个能赚钱的赛道_1.mp4 7-选品之精选联盟_1.mp4 8-好物分享的三种形式_1.mp4 9-短视频之图文课_1.mp4 10-短视频之剪辑课_1.mp4 …

el-upload+python fastAPI实现上传文件

el-upload通过action指定后端接口&#xff0c;并通过name指定传输的文件包裹在什么变量名中 <el-uploadclass"upload-demo"dragaction"https://ai.zscampus.com/toy/upload"multiplename"fileList":limit"10"accept".xlsx, .x…

昇思25天学习打卡营第9天|使用静态图加速

一、简介&#xff1a; AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介绍如下&#xff1a; &#xff08;1&#xff09;动态图&#xff1a; …

如何使用Hugging Face Transformers为情绪分析微调BERT?

情绪分析指用于判断文本中表达的情绪的自然语言处理(NLP)技术&#xff0c;它是客户反馈评估、社交媒体情绪跟踪和市场研究等现代应用背后的一项重要技术。情绪可以帮助企业及其他组织评估公众意见、提供改进的客户服务&#xff0c;并丰富产品或服务。 BERT的全称是来自Transfo…

The First Descendant第一后裔联机失败、联机报错这样处理

第一后裔/The First Descendant是一款免费的多人合作射击游戏&#xff0c;玩家将进入一片混乱的英格里斯大陆&#xff0c;扮演继承者后裔&#xff0c;通过各种主支线任务和故事剧情触发&#xff0c;最终揭开自身的秘密&#xff0c;并带领大家一起抵抗邪恶势力的入侵。为了避免玩…

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象&#xff0c;根据传递数据范围的不同&#xff0c;我们称之为不同的域&#xff0c;不同的域对象代表不同的域&#xff0c;共享数据的范围也不同。 二、…

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)

1.摄像头模组 SC130GS通过一个引脚&#xff08;SPI_I2C_MODE&#xff09;选择使用IIC或SPI配置接口&#xff0c;通过查看摄像头模组的原理图&#xff0c;可知是使用IIC接口&#xff1b; 通过手册可知IIC设备地址通过一个引脚控制&#xff0c;查看摄像头模组的原理图&#xff…

数据库调优厂商 OtterTune 宣布停止运营

昨天刷到消息&#xff0c;得知数据库优化厂商 OtterTune 停止了运营。OtterTune 的成员主要来自 CMU Andy Pavlo 教授领导的数据库实验室。公司正式成立于 2021 年 5 月&#xff0c;融资了 1450 万美金。 按照 Andy 教授的说法&#xff0c;公司是被一个收购 offer 搞砸了。同时…